From 1c31dc2c5633edebbb71b575e71d72248afbbdb4 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Mon, 22 Jul 2013 07:10:22 +0100 Subject: [PATCH 001/163] Added a null check around the get app fixes #199 --- .../tweetlanes/android/core/view/ComposeBaseFragment.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ComposeBaseFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ComposeBaseFragment.java index 50f08683..91836982 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ComposeBaseFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ComposeBaseFragment.java @@ -675,11 +675,15 @@ void clearCompose(boolean saveCurrentTweet) { { setComposeTweetDefault(null); - if (mListener != null) { + if (mListener != null) + { mListener.onMediaDetach(); } - getApp().clearTweetDraft(); + if(getApp() != null) + { + getApp().clearTweetDraft(); + } } // NOTE: Changing these text values causes a crash during the copy/paste From 055322d2fc98653861fe81393e3421cd0859aa3d Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Wed, 24 Jul 2013 07:16:38 +0100 Subject: [PATCH 002/163] Fix for #200 when loading profile from username the reply box shows correct content --- .../tweetlanes/android/core/view/BaseLaneActivity.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java index cefedd77..8adc2196 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java @@ -211,6 +211,12 @@ public void onCurrentItemClicked() { LocalBroadcastManager.getInstance(this).registerReceiver( mRestartAppReceiver, new IntentFilter("" + SystemEvent.RESTART_APP)); + + Intent intent = getIntent(); + if(intent.getAction() == Intent.ACTION_VIEW) + { + intent.putExtra("clearCompose","true"); + } } /* @@ -223,7 +229,8 @@ protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); Intent intent = getIntent(); - if (intent.getAction() != Intent.ACTION_SEND) { + if(intent.getAction() != Intent.ACTION_SEND && intent.getAction() != Intent.ACTION_VIEW) + { setComposeDefault(); } } From 449106978b04192da9e90d486d1a6a64f2e2297e Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Thu, 25 Jul 2013 07:29:56 +0100 Subject: [PATCH 003/163] Fix for #201 doing link decipher for profile description. --- .../src/org/tweetalib/android/TwitterUtil.java | 4 ++++ .../src/org/tweetalib/android/model/TwitterUser.java | 10 ++++++++++ .../tweetlanes/android/core/view/ProfileFragment.java | 6 ++++-- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterUtil.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterUtil.java index f687f131..d233f804 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterUtil.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterUtil.java @@ -70,6 +70,10 @@ public static String getTextMarkup(String text) { return getStatusMarkup(text, null, null, null); } + public static String getTextMarkup(String text, URLEntity[] urlEntities) { + return getStatusMarkup(text, null, null, urlEntities); + } + /* * return the markup for a status, which replaces t.co/ links with the * visible links diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterUser.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterUser.java index d37b5eb0..270e6568 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterUser.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterUser.java @@ -15,6 +15,7 @@ import org.socialnetlib.android.SocialNetConstant; import org.tweetalib.android.TwitterManager.ProfileImageSize; +import twitter4j.URLEntity; import twitter4j.User; public class TwitterUser { @@ -24,6 +25,9 @@ public TwitterUser(User user) { mScreenName = user.getScreenName(); mName = user.getName(); mDescription = user.getDescription(); + if (user.getDescriptionURLEntities() != null) { + mDescriptionUrlEntities = user.getDescriptionURLEntities(); + } if (user.getLocation() != null && user.getLocation().equals("") == false) { mLocation = user.getLocation(); @@ -82,6 +86,7 @@ public TwitterUser(TwitterUser user) { mScreenName = user.getScreenName(); mName = user.getName(); mDescription = user.getDescription(); + mDescriptionUrlEntities = user.getDescriptionUrlEntities(); mLocation = user.getLocation(); mUrl = user.getUrl(); mProfileImageUrlMini = user.getProfileImageUrlMini(); @@ -199,10 +204,15 @@ public String getProfileImageUrl(ProfileImageSize size) { return ""; } + public URLEntity[] getDescriptionUrlEntities() { + return mDescriptionUrlEntities; + } + private long mId; private String mScreenName; private String mName; private String mDescription; + private URLEntity[] mDescriptionUrlEntities; private String mCoverImageUrl; private String mLocation; private String mProfileImageUrlMini; diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ProfileFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ProfileFragment.java index da33167b..d92e5b60 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ProfileFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ProfileFragment.java @@ -42,6 +42,8 @@ import com.tweetlanes.android.core.util.Util; import com.tweetlanes.android.core.widget.urlimageviewhelper.UrlImageViewHelper; +import twitter4j.URLEntity; + public class ProfileFragment extends BaseLaneFragment { /* @@ -237,9 +239,9 @@ void configureView() { } String description = mUser.getDescription(); + URLEntity[] urlEntities = mUser.getDescriptionUrlEntities(); if (description != null) { - String descriptionMarkup = TwitterUtil - .getTextMarkup(description); + String descriptionMarkup = TwitterUtil.getTextMarkup(description, urlEntities); descriptionTextView.setText(Html.fromHtml(descriptionMarkup + " ")); descriptionTextView.setMovementMethod(LinkMovementMethod From bf475e24a37fe3d5d49f50e1520e811599604ff7 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Thu, 25 Jul 2013 07:35:03 +0100 Subject: [PATCH 004/163] Bumping up the version numbers on main app and beta --- android/client/AndroidManifest.xml | 4 ++-- android/clientbeta/AndroidManifest.xml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/android/client/AndroidManifest.xml b/android/client/AndroidManifest.xml index 48927169..0dca7cc5 100644 --- a/android/client/AndroidManifest.xml +++ b/android/client/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="50" + android:versionName="1.2.1"> diff --git a/android/clientbeta/AndroidManifest.xml b/android/clientbeta/AndroidManifest.xml index 478335c0..79f848f6 100644 --- a/android/clientbeta/AndroidManifest.xml +++ b/android/clientbeta/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="6" + android:versionName="1.2.1_b1"> From 84be52ba03ba88d6a9d94f36b38089976e73ae8f Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Thu, 25 Jul 2013 07:36:53 +0100 Subject: [PATCH 005/163] Added fixes to change log --- android/libraries/TweetLanesCore/res/xml/changelog.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/android/libraries/TweetLanesCore/res/xml/changelog.xml b/android/libraries/TweetLanesCore/res/xml/changelog.xml index 1088fdc1..ded91fc6 100644 --- a/android/libraries/TweetLanesCore/res/xml/changelog.xml +++ b/android/libraries/TweetLanesCore/res/xml/changelog.xml @@ -1,5 +1,9 @@ + + Fix - Links in profile descriptions converted from t.co links + Fix - Reply when loading profile correction. Show "Tweet @username" + Feature - Auto complete of @mentions and #hashtags Feature - New account switcher with picture and service icon From ad50639a63ca1f31d94a616dd3ebb88f30d8ebc4 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Thu, 25 Jul 2013 07:47:10 +0100 Subject: [PATCH 006/163] Fix for #204 - Change the change log dialogue to show everything if it can't find the correct version. --- .../src/com/inscription/ChangeLogDialog.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/inscription/ChangeLogDialog.java b/android/libraries/TweetLanesCore/src/com/inscription/ChangeLogDialog.java index 2135e6ce..24a30011 100644 --- a/android/libraries/TweetLanesCore/src/com/inscription/ChangeLogDialog.java +++ b/android/libraries/TweetLanesCore/src/com/inscription/ChangeLogDialog.java @@ -205,15 +205,19 @@ protected void show(final int version) { title = String.format("%s v%s", title, getAppVersion()); //Create html change log - final String htmlChangelog = getHTMLChangelog(R.xml.changelog, resources, version); + String htmlChangelog = getHTMLChangelog(R.xml.changelog, resources, version); //Get button strings final String closeString = resources.getString(R.string.changelog_close); //Check for empty change log if (htmlChangelog.length() == 0) { - //It seems like there is nothing to show, just bail out. - return; + //It seems like there is nothing to try with version 0. + htmlChangelog = getHTMLChangelog(R.xml.changelog, resources, 0); + if (htmlChangelog.length() == 0) { + //It seems like there is still nothing to show, just bail out. + return; + } } //Create web view and load html From 6b0443f49aa52c7d0c6c31a1b8403d0eafafdcfc Mon Sep 17 00:00:00 2001 From: sinisterdragon Date: Wed, 31 Jul 2013 11:15:13 -0500 Subject: [PATCH 007/163] Add a Favorite Button Pressed state to add a visual cue and indication when the favorite button is pressed --- android/clientbeta/clientbeta.iml | 9 +++------ .../ic_action_star_pressed_dark.png | Bin 0 -> 2422 bytes .../ic_ic_action_star_pressed_light.png | Bin 0 -> 2688 bytes .../ic_action_star_pressed_dark.png | Bin 0 -> 1379 bytes .../ic_ic_action_star_pressed_light.png | Bin 0 -> 1460 bytes .../ic_action_star_pressed_dark.png | Bin 0 -> 3743 bytes .../ic_action_star_pressed_light.png | Bin 0 -> 6261 bytes .../ic_ic_action_star_pressed_light.png | Bin 0 -> 4211 bytes .../ic_action_star_pressed_dark.png | Bin 0 -> 7504 bytes .../ic_ic_action_star_pressed_light.png | Bin 0 -> 8324 bytes .../core/view/TweetSpotlightActivity.java | 9 +++++++++ 11 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 android/libraries/TweetLanesCore/res/drawable-hdpi/ic_action_star_pressed_dark.png create mode 100644 android/libraries/TweetLanesCore/res/drawable-hdpi/ic_ic_action_star_pressed_light.png create mode 100644 android/libraries/TweetLanesCore/res/drawable-mdpi/ic_action_star_pressed_dark.png create mode 100644 android/libraries/TweetLanesCore/res/drawable-mdpi/ic_ic_action_star_pressed_light.png create mode 100644 android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_action_star_pressed_dark.png create mode 100644 android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_action_star_pressed_light.png create mode 100644 android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_ic_action_star_pressed_light.png create mode 100644 android/libraries/TweetLanesCore/res/drawable-xxhdpi/ic_action_star_pressed_dark.png create mode 100644 android/libraries/TweetLanesCore/res/drawable-xxhdpi/ic_ic_action_star_pressed_light.png diff --git a/android/clientbeta/clientbeta.iml b/android/clientbeta/clientbeta.iml index 174ed9de..f9b2005d 100644 --- a/android/clientbeta/clientbeta.iml +++ b/android/clientbeta/clientbeta.iml @@ -2,20 +2,17 @@ - - + - - - + + diff --git a/android/libraries/TweetLanesCore/res/drawable-hdpi/ic_action_star_pressed_dark.png b/android/libraries/TweetLanesCore/res/drawable-hdpi/ic_action_star_pressed_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..ea3947065ddee74c34ac68311056166817018339 GIT binary patch literal 2422 zcmV-+35oWJP)3}|e`_%xkd^bQIkSPSjhe*I#5bwzPj=%s>fC}|SNWay0f zdev48LGaVfwqLp0O%C zccxF$$PXN7=)Ty{<2`7z+pZdiQK8QcR$Pn}q%YUXDJ*w!oN{@pio&;*w=Vd7PQ0}* zWO;`BvR%2lQw?^n;8>&eNRWZf?5I502^AM}&l1w_z+fPhNU~ZDK4(HEcNc*WUP?ql z0vv^542EHx34n7X#Nr`wkV6ts6rQqS?8sb(<98N(TKUBzK`k!FS~pEzE5zXU|9s2z zHN%D~Q4X#nAk+;(eke!?_z=(YexDzLU@l;1Id?3P7J#4%sMc!bjrn=t0bsrl41W7c z1EqwqXbM49Fp8i|h?jCauR$PK2mn|D93&Vdlo2>7#9=uGBO@azLY*8Ylw9nv&sm_4 z=xafbMoCkbdU~{~q}Ji{b-EZUsMgK^$2(|0>vu3Ae~{-nmJOkxT>TgVnT4pJH^>HA zw}-dWc6;0I{B#-y(gPQj-cqS3+4MNM_{|IrH35YnOoStd7)MbOLvRFwzzYH`h6isr z1iGM~gCQH3y;QYLunQ`Np9~WSxB2J4C?Zg7KEgw4U=>JkEe5W|fYxCgI0RUp@q}2` z8{{~ahe9_k?&`aaz&S^NzWmk96wAX<7Vd2!CDF_nrBE~@Gm=`A7Dgq9c`^z03&fHreka9TwdUO~uHBKv4kQgP! z5eZ2mO4=9HOG#oSj==glhp+DZgWgjPCQxDSCL4_TQNBmXpT27sK6%s(wMtATyr!iV zP97m!>}vH6B9p?;#h8FH+|;1$#J6B8>+v2uflR; z-MWXC>3dbl!<(*Ek`$y)7_XMEoE|A#0%CZr&FR@ZUaM$(0dVk@2Ucy8O7;oJ?&;rj z(Wh^8I`^YaXMOR!bl>B8_f)x9RaPyIAjOk(QZjc*oGJ(8+JoC>_lNJ5-M@2Vm?ki@ zyd3*Y+}NbCYRSibmPNDLsb zJUq)#r-)UPNkAH=%!-mNic^SG7JqQdnw!^;RAdd!2xbCZ+qGfRVl72%ZKnN>3+>LY zTU^X#Q%|7w)S_dK{)%T%<$LGm!K3ycLhQV<0XQ+p(uHSl^&y$ ziBH$tJzb@3JqD+jy>i#>Y(ASivCl~M+d~Hh>$`c}7bSv4sruA0YU%R4cy-RPMtkO( z)F(x?KghoVv0b85RUB`$UZ}IW4_CEyR#y~d0ofmT3<+$Op;j5M!n5*6s|!JIBn!@0 zF91*M9c=P{_s(|V&Ros$Mu!(U*kIXfvAN2P`4b-Y)q%#4zzR$2V-zA{+4@w?QU!ru z4lg?W9%RfPngJ~45%Y)4Z#@BS-j{bekJ{*_n>vCbmi;tMGrQjIUomxrUxoRSj3;+S!oc{=4L34zZAlfg6-JX_l2_}tLt z?kdfR2d)8vu5|Rgo}!W+-&1Qo-`pE8*0v%4tSA~aV4e*Mw)Xse87V;KWQ2>B=f)`Y z#-{ck9y-z1lavvzT9={AkCc$BLL8^KY4zS@IgXzgL8TKY>};c%1N&}1Fx(b&TNlY9 z6$MGr7tcL#wqG-Qj27B;=J32UAQk<>$L}%jelxj!_;LX((b@~mDPbab+4>aiQnM#;lp;`Bq(nHMW;{aQ`0m1tI#hI0;m_AM; zdG`lV^2`=G&{)>)Jnr%ZOT8|(Vf%lQyT44yGt?6LNOBB?6SK3UWO;g-aLjd6Z`GAf z#~*6kO%8hG{eftS z2pb1hZnBOdbeGI7gUR748>j#V1S>psOD<8!QdL4kO0)d^E<4g~s%myU>pwYtjXY*- z3>7ZpBP1du*5VC%db~u<;d#;hR_36g)KCN^!h3?o{4CF4qBxkEgY$59S+xic!i2e# oaS!C}29=8;-0XkylUEk(UyxfcV)8P1=l}o!07*qoM6N<$f|JmalK=n! literal 0 HcmV?d00001 diff --git a/android/libraries/TweetLanesCore/res/drawable-hdpi/ic_ic_action_star_pressed_light.png b/android/libraries/TweetLanesCore/res/drawable-hdpi/ic_ic_action_star_pressed_light.png new file mode 100644 index 0000000000000000000000000000000000000000..eb236c5461bbe5c8011857aa141c620eade36bb6 GIT binary patch literal 2688 zcmV-`3V-#9P)YqwYe^u%dRh6a4Z4_B?(}=ouY@A>c6O3(!ZD0n58D{1&%bT~{dwU-;k&_azp~;m- z^U#}j-?``e?m6cI!T)1)bxC_rP;MUE!snIuGa62Bm1{RAAsq|3W9_Z5!LyQB+w&yFQ)rsueZ>;QwwcP?k^-rA% zBTr2al)c9QhG9VH9cY#=FV2m{!RY9YS=$}3_IA0k^H>Y?M24s=9t8l`AVy|s)woCt z`dIqHpEH~_wv&493RvK=XM$QoQx_1`N0oBn7zIGF1JT>SHpf`GbTu_SG7BaqtS=iF zZan$@M&u6+07>okCnuf+99g0H&}B&NG_#Cr#{B%p`O$aQcEZ}u8RJdgG|=4vWpPj} z=lZ;>iw6NAb|oAeuLkNe)FC&`QsMpF`PY{@Fy}#8+bJ;UKXoSP3r3GXfciOGPYae& zhK!n2RFwSQo)H3Jl3K>q^kO~^uADW#Bw&4F-RaI4_5}w;tJ3dVni}A2U4YcF5kyZE z8V^j`S|m+@{Xr#@ys`H7+5Cf+^FbL~|9x%OaZNnX(E%0DpeLJnLMg692oQh8thKy^ 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 literal 0 HcmV?d00001 diff --git a/android/libraries/TweetLanesCore/res/drawable-mdpi/ic_ic_action_star_pressed_light.png b/android/libraries/TweetLanesCore/res/drawable-mdpi/ic_ic_action_star_pressed_light.png new file mode 100644 index 0000000000000000000000000000000000000000..021324dfd25266756f679906247e43a3edde283d GIT binary patch literal 1460 zcmV;l1xxygP)P000>X1^@s6#OZ}&000GhNkl6fEgdqOllEY^6<~nx?Ty(>MFtq&_w#eQ9eS z``SbvnzmMIys(Nlico1pML?0|va`Fu?#}MqXHI8KZ734pq4PTDJHPY){@?eV1Ho25 zjG@rk>E%g2h$vQxDCw1WJZ^3!9ByTiyQZnBmzHYiDDZll5U|r=YU=*X{djgO@mq#e zw|0fd9XsDN8SW6U?Rl^~f8kVX!_=8GXY9>DTY~iV_7b;pWE~L-AA^Q+z-E2Vu_pK9 zr}K9gMt+t57f7V7%|lc+97MK#f?J;7T`Y?{G%3$5O`N&`Pfv5T^dDbBL;ipS<^d`24pIuv3tA1yRS z0quzbV0e*kI_hjdIDLU_3jqWfgkXqG%{Cek{20ON#p!gqi!ZBuuNaO##n6_Z4P=0^ zZ6m^|Gz2V?gc#8VwzUM6Nl(Jq{E$YeI!* z8;uXw({F#eR2dAGzDt|tVL4E_XffVFC>QUk32{~&yCnZxU2ek-CJRBTvZjI3wYL~4 zz0dJvS_1foI;@Sa3v%b#-h)wr_k9FNs!SwPpIko3e_}&62XH;x8X|@_5IPmLJux8J@59 ziF3NDeaAhprm7Aw^fCX!qvo8fot+!LF%16k<0ULoziU?@6gr*V)-Z=LxQ#PU{y5dq zv9fjotlNySSd5$u)YOs$ebSqJR-2dPFXzVYEI7f?NgEOb0r#ChZ&x=o1cL$Li$c}T zqE0abdUAXy9gi2*Dqa^7Y3uda)xutnmV2MhCNnvi`&u(+13c|}gF{3_XQ-s461Vvf zu|TA=pITM5QP~%|X^JxgsjI(;TY^+{ye$x~)pvSR&rbkNxn^Tiq_K6>qP>+C$FGoT zAp}fq$prN8q%M0f$9EOWUmr20FoI)-fH8eK>XPxbd}8$w(^rc1W%AqnaO z&vK&OWcWp$4?HnQdc@X^2RM_Qk-qL!6jdn&^-bE_K3R$RmXcF{AMw+?iK=KK~Prb8at(4*WFF4ny(B7 z15JS8>Y!ny@k-+6$A_AetIPORNXsYGVklohGptw5ic9r`vf-=5RrTHFQ7`8&6DUGQ zxuv|Ax%qQpbx*Bpe5|vRkR%EA^z>MpU9B&2@2J`+X49K-vq!>K{{IcD7Qc;T_U~E% O0000B6 literal 0 HcmV?d00001 diff --git a/android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_action_star_pressed_dark.png b/android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_action_star_pressed_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..3bcb50c35f6f52b69c95d75b8944cd1361e5d665 GIT binary patch literal 3743 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 literal 0 HcmV?d00001 diff --git a/android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_action_star_pressed_light.png b/android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_action_star_pressed_light.png new file mode 100644 index 0000000000000000000000000000000000000000..a43fad115ceb5633afb4c369a521956029e74b43 GIT binary patch literal 6261 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 literal 0 HcmV?d00001 diff --git a/android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_ic_action_star_pressed_light.png b/android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_ic_action_star_pressed_light.png new file mode 100644 index 0000000000000000000000000000000000000000..2b9932839990f5aa9a599eba09e5ca4e687eda23 GIT binary patch literal 4211 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 O0000 Date: Wed, 31 Jul 2013 11:45:01 -0500 Subject: [PATCH 008/163] Add a Favorite Button Pressed state to add a visual cue and indication when the favorite button is pressed --- android/client/AndroidManifest.xml | 2 +- android/clientbeta/AndroidManifest.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/android/client/AndroidManifest.xml b/android/client/AndroidManifest.xml index 2ff162e0..f1116739 100644 --- a/android/client/AndroidManifest.xml +++ b/android/client/AndroidManifest.xml @@ -2,7 +2,7 @@ + android:versionName="1.2.1"> diff --git a/android/clientbeta/AndroidManifest.xml b/android/clientbeta/AndroidManifest.xml index 478335c0..e7d94999 100644 --- a/android/clientbeta/AndroidManifest.xml +++ b/android/clientbeta/AndroidManifest.xml @@ -2,7 +2,7 @@ + android:versionName="1.2.1_b2"> From 0746673d520063ae9a22d398e58ddb587e460bc2 Mon Sep 17 00:00:00 2001 From: sinisterdragon Date: Wed, 31 Jul 2013 12:06:57 -0500 Subject: [PATCH 009/163] Added favorite button pressed to have visual cue when you try to favorite a tween --- .../ic_action_star_pressed_dark.png | Bin 0 -> 2422 bytes .../ic_ic_action_star_pressed_light.png | Bin 0 -> 2688 bytes .../ic_action_star_pressed_dark.png | Bin 0 -> 1379 bytes .../ic_ic_action_star_pressed_light.png | Bin 0 -> 1460 bytes .../ic_action_star_pressed_dark.png | Bin 0 -> 3743 bytes .../ic_action_star_pressed_light.png | Bin 0 -> 6261 bytes .../ic_ic_action_star_pressed_light.png | Bin 0 -> 4211 bytes .../ic_action_star_pressed_dark.png | Bin 0 -> 7504 bytes .../ic_ic_action_star_pressed_light.png | Bin 0 -> 8324 bytes .../core/view/TweetSpotlightActivity.java | 7 +++++++ 10 files changed, 7 insertions(+) create mode 100644 android/libraries/TweetLanesCore/res/drawable-hdpi/ic_action_star_pressed_dark.png create mode 100644 android/libraries/TweetLanesCore/res/drawable-hdpi/ic_ic_action_star_pressed_light.png create mode 100644 android/libraries/TweetLanesCore/res/drawable-mdpi/ic_action_star_pressed_dark.png create mode 100644 android/libraries/TweetLanesCore/res/drawable-mdpi/ic_ic_action_star_pressed_light.png create mode 100644 android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_action_star_pressed_dark.png create mode 100644 android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_action_star_pressed_light.png create mode 100644 android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_ic_action_star_pressed_light.png create mode 100644 android/libraries/TweetLanesCore/res/drawable-xxhdpi/ic_action_star_pressed_dark.png create mode 100644 android/libraries/TweetLanesCore/res/drawable-xxhdpi/ic_ic_action_star_pressed_light.png diff --git a/android/libraries/TweetLanesCore/res/drawable-hdpi/ic_action_star_pressed_dark.png b/android/libraries/TweetLanesCore/res/drawable-hdpi/ic_action_star_pressed_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..ea3947065ddee74c34ac68311056166817018339 GIT binary patch literal 2422 zcmV-+35oWJP)3}|e`_%xkd^bQIkSPSjhe*I#5bwzPj=%s>fC}|SNWay0f zdev48LGaVfwqLp0O%C zccxF$$PXN7=)Ty{<2`7z+pZdiQK8QcR$Pn}q%YUXDJ*w!oN{@pio&;*w=Vd7PQ0}* zWO;`BvR%2lQw?^n;8>&eNRWZf?5I502^AM}&l1w_z+fPhNU~ZDK4(HEcNc*WUP?ql z0vv^542EHx34n7X#Nr`wkV6ts6rQqS?8sb(<98N(TKUBzK`k!FS~pEzE5zXU|9s2z zHN%D~Q4X#nAk+;(eke!?_z=(YexDzLU@l;1Id?3P7J#4%sMc!bjrn=t0bsrl41W7c z1EqwqXbM49Fp8i|h?jCauR$PK2mn|D93&Vdlo2>7#9=uGBO@azLY*8Ylw9nv&sm_4 z=xafbMoCkbdU~{~q}Ji{b-EZUsMgK^$2(|0>vu3Ae~{-nmJOkxT>TgVnT4pJH^>HA zw}-dWc6;0I{B#-y(gPQj-cqS3+4MNM_{|IrH35YnOoStd7)MbOLvRFwzzYH`h6isr z1iGM~gCQH3y;QYLunQ`Np9~WSxB2J4C?Zg7KEgw4U=>JkEe5W|fYxCgI0RUp@q}2` z8{{~ahe9_k?&`aaz&S^NzWmk96wAX<7Vd2!CDF_nrBE~@Gm=`A7Dgq9c`^z03&fHreka9TwdUO~uHBKv4kQgP! z5eZ2mO4=9HOG#oSj==glhp+DZgWgjPCQxDSCL4_TQNBmXpT27sK6%s(wMtATyr!iV zP97m!>}vH6B9p?;#h8FH+|;1$#J6B8>+v2uflR; z-MWXC>3dbl!<(*Ek`$y)7_XMEoE|A#0%CZr&FR@ZUaM$(0dVk@2Ucy8O7;oJ?&;rj z(Wh^8I`^YaXMOR!bl>B8_f)x9RaPyIAjOk(QZjc*oGJ(8+JoC>_lNJ5-M@2Vm?ki@ zyd3*Y+}NbCYRSibmPNDLsb zJUq)#r-)UPNkAH=%!-mNic^SG7JqQdnw!^;RAdd!2xbCZ+qGfRVl72%ZKnN>3+>LY zTU^X#Q%|7w)S_dK{)%T%<$LGm!K3ycLhQV<0XQ+p(uHSl^&y$ ziBH$tJzb@3JqD+jy>i#>Y(ASivCl~M+d~Hh>$`c}7bSv4sruA0YU%R4cy-RPMtkO( z)F(x?KghoVv0b85RUB`$UZ}IW4_CEyR#y~d0ofmT3<+$Op;j5M!n5*6s|!JIBn!@0 zF91*M9c=P{_s(|V&Ros$Mu!(U*kIXfvAN2P`4b-Y)q%#4zzR$2V-zA{+4@w?QU!ru z4lg?W9%RfPngJ~45%Y)4Z#@BS-j{bekJ{*_n>vCbmi;tMGrQjIUomxrUxoRSj3;+S!oc{=4L34zZAlfg6-JX_l2_}tLt z?kdfR2d)8vu5|Rgo}!W+-&1Qo-`pE8*0v%4tSA~aV4e*Mw)Xse87V;KWQ2>B=f)`Y z#-{ck9y-z1lavvzT9={AkCc$BLL8^KY4zS@IgXzgL8TKY>};c%1N&}1Fx(b&TNlY9 z6$MGr7tcL#wqG-Qj27B;=J32UAQk<>$L}%jelxj!_;LX((b@~mDPbab+4>aiQnM#;lp;`Bq(nHMW;{aQ`0m1tI#hI0;m_AM; zdG`lV^2`=G&{)>)Jnr%ZOT8|(Vf%lQyT44yGt?6LNOBB?6SK3UWO;g-aLjd6Z`GAf z#~*6kO%8hG{eftS z2pb1hZnBOdbeGI7gUR748>j#V1S>psOD<8!QdL4kO0)d^E<4g~s%myU>pwYtjXY*- z3>7ZpBP1du*5VC%db~u<;d#;hR_36g)KCN^!h3?o{4CF4qBxkEgY$59S+xic!i2e# oaS!C}29=8;-0XkylUEk(UyxfcV)8P1=l}o!07*qoM6N<$f|JmalK=n! literal 0 HcmV?d00001 diff --git a/android/libraries/TweetLanesCore/res/drawable-hdpi/ic_ic_action_star_pressed_light.png b/android/libraries/TweetLanesCore/res/drawable-hdpi/ic_ic_action_star_pressed_light.png new file mode 100644 index 0000000000000000000000000000000000000000..eb236c5461bbe5c8011857aa141c620eade36bb6 GIT binary patch literal 2688 zcmV-`3V-#9P)YqwYe^u%dRh6a4Z4_B?(}=ouY@A>c6O3(!ZD0n58D{1&%bT~{dwU-;k&_azp~;m- z^U#}j-?``e?m6cI!T)1)bxC_rP;MUE!snIuGa62Bm1{RAAsq|3W9_Z5!LyQB+w&yFQ)rsueZ>;QwwcP?k^-rA% zBTr2al)c9QhG9VH9cY#=FV2m{!RY9YS=$}3_IA0k^H>Y?M24s=9t8l`AVy|s)woCt z`dIqHpEH~_wv&493RvK=XM$QoQx_1`N0oBn7zIGF1JT>SHpf`GbTu_SG7BaqtS=iF zZan$@M&u6+07>okCnuf+99g0H&}B&NG_#Cr#{B%p`O$aQcEZ}u8RJdgG|=4vWpPj} z=lZ;>iw6NAb|oAeuLkNe)FC&`QsMpF`PY{@Fy}#8+bJ;UKXoSP3r3GXfciOGPYae& zhK!n2RFwSQo)H3Jl3K>q^kO~^uADW#Bw&4F-RaI4_5}w;tJ3dVni}A2U4YcF5kyZE z8V^j`S|m+@{Xr#@ys`H7+5Cf+^FbL~|9x%OaZNnX(E%0DpeLJnLMg692oQh8thKy^ zgrD(J>T3<{GmMZsu$sBH^v3NJ0HYh_ysurl0Stn^J^}cA7)TNh=@?VhKwi`2yWa!( z3%I6}^>5X-5%S0Ub})R9BK2@h>f=+`Hgn6~$d7}Iw=1gO|9c{Mf~zgPSGgvz_ zSXfF>Q@1J@GcLjmn-bq9TwElR77c}B#Y3}IMnKdd;QV>l%7_aLM;?9FBZcaNj)ZF@ zQBo-}MC34x0mFB#ZYQ0}N5hAmIQh!~(GZzZOKo5HKMGC0j2QGK;Aq1T8H} zW5=;t5{~Q#g3<;c4kPLyOdP%{M!Av$z@aco(cK1yd;$Rhggxn*PRY>4Y@qfhsSAJS z<>JQ8=j)9`|6pl8Q?Gky3PT_hM(quI;tw;h{=x3Ii%QQw#M_)pGLf|xgo}s>Hs-|D0|AFb1|H`R3@}kv%Hbw1Ey0_-Wo|)IxxJWK zTL!~tEBDF;4xTvSRn^)Ctav-1LwkMM`KNimxh+4LsqOepHM5Y^FTLej%!7wO9wsBP zBjNhB#7}wI`l%pE#rn3(Hdf+-RlY?^<=IqmJ`1i~sk#gOtd1cr8%kYcYaNnn_ag)j zdsh=r3RZ=02(oNR+Ut1~`1i_up#b9N&HGeyRD1l4C*ov|iH`F_UcP3_<13aTEu#eC zIIv5%STZ-4*6$SVHT=y5w&l3ebg(@_HE|#BmHnE&^q5pCbRuGzj;Nf=$@01MYHE?^ zEw_wYj@ZypD8PhgF`(aLSk$WC&_boQWt37nM@%zbEoB$EGq_dwl%H;){C#56lY9J7 z3pWu>+mET!?O&Su8V6?~$C@mN!B-NO-g2#Gt0DCE4ZO#PB@y}`e_4!*{ z`vU$j{+;QmL2LEZUEAfq&rT%Nqcn|#Z}aX-Ky&-D?g z)gA$|&=;B?KZ$H}CXakCFJ5^&cTXKRoWW&ag9Wj-|L89rQSQvO^j_nRk)aji+S0<< zTfJ3 z^$NIgVSU^8^bbDI-Q>H)+I>^iKqLhz87t;j#+XL%6?TNOx?8gue1v1lL=T;>d zlJAvxYU*aBu2Twwa=+vlFL2xA=SnUxjAaeU`!^l=u4NWW`Ho<=Nd@TFwkLq}=FaPc zvRkN_A4$FWr{q?8xGk{2Gd~EbzEBT_Xs9MRd5Winy} zsLI+|#VGIP4tYXv>bzl#o-}l_w8GK>o~7n^ zdW`Z!pjy7*QaRW(4k1oZVx<5hRS4xEKP9!Pditnr6k2%@Fc^e$*l}W&aO12|(>MdT zS=+h72P^;jt9$PJ#Qg6Cxg}$D-6u7%wYdvO$}ufF`wg*L_VWzo5K%IV;e8)6*)vb6 zHAif78WhTD(_FK(VAuy#Pcy_)JGP92S~fAnMOo&H0k-U2D@NPi=U^us+jwueFt^Cd zx#u;q{Xcbt8H# z(&}@(H4QxRv_d4dE5&p-Pb){bPh!3SE;7Py5~F%CJvtr-i<|4&R={xVt7qy#C^X0$ z_o!N0J!mPu86Ng#d6u1X3~LTmvP;WTV{0HD|Ez)|&bEs8)`x*s6Jv<&6D_+Po5fBm zP?u+v%tE_*(MTjFawF$mpZuS(B{27-jeY(;BC7}Z`4LlM&LfM=FlsHPW|O(QTD3(4 z>JtOc9Pnybi84vpi)5vhXZ~7BZ5>vsqte>y#N6jP000>X1^@s6#OZ}&000FlNklmbN@ZP$p~)A5b<0VInh=s<;QvEGA3TZE?$%#jVCHTQ;)| zO_rF&!5+Sf%Z4~mbW%`cO@N`GQh`3O&|XR(^!9ye?^-jBFKCyT{rNd%Vi?|ZaX2dtN-Uc|W;=yza^l;mQ9Rm+m0o!6$3BMc|nw!11L@Khmtd&ZIrk{EkRQyFz#ldj|a23Nzu3fc5i zgVd^S5YtmArCTz%?~@1wOCS{DpB%M*rJwS3H7k|`V}W9}3&Swr)nn?^;=Ih=>(W@6 z$A^sv>T*T<&P_OO_YU1Y^vgE+Bme-|LZFzC%Csa$FQIm4F>!n3=W0~4x87nGr@lCT?m(hFU;jKw-oc~t0IsY zmp?ElX42grG~}}&sLvTdUDt1os6VV;HF2-^U$kCHTe>(~&Ln{hJ_J%|Ac10Vy6Fru zDL(>9>b1D93|pNit+sIAT}`Twv{FS9k#uz$e`^7cUVLW6`1!j<*%x97`k>g+>b}v8 ztlf|;`lugv_gt+n{q1LV)F81e zy5VRGw0&hkrHGZN7?|;l7%bMtrM6syLIH%Lu@AXR-r1SJHG$Hi#iGsCQqD_*ufYOD^(0*|n-5D~SZ03G(0t-ytc~bHq2F9ulfl~ydK@hq@-tNPLCy@0 zDo`4;re$>cpwFFiz4>1q9^C&#NPS}`nU=n&a+8d+L#Lnoc*pA8YxSLaay2)cm&4=d z51D5M+HBz)O=ao+qnC%5Nzzk4J3VGQ>e1h6Z`xkwe>9Q+Bx3=+Nj*+Mk*g>+EqsHlOU1 zKA$Pr^Bj*3X&s0aY1%p8Y@^SOx(Xh0EryFIrD(kefA~{pPvR8MzLHRG^h>4WXvVX;qfY#bLs0@ zlmx+5GcwTw&wg@fwX8oTBu>kRW{|8%$PU^*!&7lAQ002ovPDHLkV1oOem1_V1 literal 0 HcmV?d00001 diff --git a/android/libraries/TweetLanesCore/res/drawable-mdpi/ic_ic_action_star_pressed_light.png b/android/libraries/TweetLanesCore/res/drawable-mdpi/ic_ic_action_star_pressed_light.png new file mode 100644 index 0000000000000000000000000000000000000000..021324dfd25266756f679906247e43a3edde283d GIT binary patch literal 1460 zcmV;l1xxygP)P000>X1^@s6#OZ}&000GhNkl6fEgdqOllEY^6<~nx?Ty(>MFtq&_w#eQ9eS z``SbvnzmMIys(Nlico1pML?0|va`Fu?#}MqXHI8KZ734pq4PTDJHPY){@?eV1Ho25 zjG@rk>E%g2h$vQxDCw1WJZ^3!9ByTiyQZnBmzHYiDDZll5U|r=YU=*X{djgO@mq#e zw|0fd9XsDN8SW6U?Rl^~f8kVX!_=8GXY9>DTY~iV_7b;pWE~L-AA^Q+z-E2Vu_pK9 zr}K9gMt+t57f7V7%|lc+97MK#f?J;7T`Y?{G%3$5O`N&`Pfv5T^dDbBL;ipS<^d`24pIuv3tA1yRS z0quzbV0e*kI_hjdIDLU_3jqWfgkXqG%{Cek{20ON#p!gqi!ZBuuNaO##n6_Z4P=0^ zZ6m^|Gz2V?gc#8VwzUM6Nl(Jq{E$YeI!* z8;uXw({F#eR2dAGzDt|tVL4E_XffVFC>QUk32{~&yCnZxU2ek-CJRBTvZjI3wYL~4 zz0dJvS_1foI;@Sa3v%b#-h)wr_k9FNs!SwPpIko3e_}&62XH;x8X|@_5IPmLJux8J@59 ziF3NDeaAhprm7Aw^fCX!qvo8fot+!LF%16k<0ULoziU?@6gr*V)-Z=LxQ#PU{y5dq zv9fjotlNySSd5$u)YOs$ebSqJR-2dPFXzVYEI7f?NgEOb0r#ChZ&x=o1cL$Li$c}T zqE0abdUAXy9gi2*Dqa^7Y3uda)xutnmV2MhCNnvi`&u(+13c|}gF{3_XQ-s461Vvf zu|TA=pITM5QP~%|X^JxgsjI(;TY^+{ye$x~)pvSR&rbkNxn^Tiq_K6>qP>+C$FGoT zAp}fq$prN8q%M0f$9EOWUmr20FoI)-fH8eK>XPxbd}8$w(^rc1W%AqnaO z&vK&OWcWp$4?HnQdc@X^2RM_Qk-qL!6jdn&^-bE_K3R$RmXcF{AMw+?iK=KK~Prb8at(4*WFF4ny(B7 z15JS8>Y!ny@k-+6$A_AetIPORNXsYGVklohGptw5ic9r`vf-=5RrTHFQ7`8&6DUGQ zxuv|Ax%qQpbx*Bpe5|vRkR%EA^z>MpU9B&2@2J`+X49K-vq!>K{{IcD7Qc;T_U~E% O0000B6 literal 0 HcmV?d00001 diff --git a/android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_action_star_pressed_dark.png b/android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_action_star_pressed_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..3bcb50c35f6f52b69c95d75b8944cd1361e5d665 GIT binary patch literal 3743 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 literal 0 HcmV?d00001 diff --git a/android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_action_star_pressed_light.png b/android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_action_star_pressed_light.png new file mode 100644 index 0000000000000000000000000000000000000000..a43fad115ceb5633afb4c369a521956029e74b43 GIT binary patch literal 6261 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 literal 0 HcmV?d00001 diff --git a/android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_ic_action_star_pressed_light.png b/android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_ic_action_star_pressed_light.png new file mode 100644 index 0000000000000000000000000000000000000000..2b9932839990f5aa9a599eba09e5ca4e687eda23 GIT binary patch literal 4211 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 O0000 Date: Wed, 31 Jul 2013 13:43:22 -0500 Subject: [PATCH 010/163] Add a Favorite Button Pressed state to add a visual cue and indication when the favorite button is pressed --- android/client/AndroidManifest.xml | 4 ++-- android/clientbeta/AndroidManifest.xml | 4 ++-- android/libraries/TweetLanesCore/res/xml/changelog.xml | 3 +++ 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/android/client/AndroidManifest.xml b/android/client/AndroidManifest.xml index 0dca7cc5..8c41bb41 100644 --- a/android/client/AndroidManifest.xml +++ b/android/client/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="51" + android:versionName="1.2.2"> diff --git a/android/clientbeta/AndroidManifest.xml b/android/clientbeta/AndroidManifest.xml index 79f848f6..e7d94999 100644 --- a/android/clientbeta/AndroidManifest.xml +++ b/android/clientbeta/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="5" + android:versionName="1.2.1_b2"> diff --git a/android/libraries/TweetLanesCore/res/xml/changelog.xml b/android/libraries/TweetLanesCore/res/xml/changelog.xml index ded91fc6..5ed293e4 100644 --- a/android/libraries/TweetLanesCore/res/xml/changelog.xml +++ b/android/libraries/TweetLanesCore/res/xml/changelog.xml @@ -1,5 +1,8 @@ + + Feature - Added a visual cue when favorite button is pressed + Fix - Links in profile descriptions converted from t.co links Fix - Reply when loading profile correction. Show "Tweet @username" From 480cf1191166e78703fc662c9ef7ed4b2237f191 Mon Sep 17 00:00:00 2001 From: sinisterdragon Date: Wed, 31 Jul 2013 14:24:13 -0500 Subject: [PATCH 011/163] Changed "ChangeLog" and Version properties --- android/client/AndroidManifest.xml | 4 ++-- android/client/project.properties | 3 ++- android/clientbeta/AndroidManifest.xml | 4 ++-- android/clientbeta/project.properties | 3 ++- android/libraries/SocialNetLib/project.properties | 2 +- android/libraries/TweetLanesCore/TweetLanesCore.iml | 10 +++------- android/libraries/TweetLanesCore/project.properties | 2 +- android/libraries/TweetLanesCore/res/xml/changelog.xml | 4 ++++ .../tweetlanes/android/core/ConsumerKeyConstants.java | 8 ++++---- 9 files changed, 21 insertions(+), 19 deletions(-) diff --git a/android/client/AndroidManifest.xml b/android/client/AndroidManifest.xml index 0dca7cc5..8c41bb41 100644 --- a/android/client/AndroidManifest.xml +++ b/android/client/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="51" + android:versionName="1.2.2"> diff --git a/android/client/project.properties b/android/client/project.properties index 639acfbf..48bb41d9 100644 --- a/android/client/project.properties +++ b/android/client/project.properties @@ -8,8 +8,9 @@ # project structure. # Project target. -target=android-17 +target=Google Inc.:Google APIs:17 proguard.config=proguard.cfg android.library.reference.1=../libraries/TweetLanesCore + diff --git a/android/clientbeta/AndroidManifest.xml b/android/clientbeta/AndroidManifest.xml index 79f848f6..735511b3 100644 --- a/android/clientbeta/AndroidManifest.xml +++ b/android/clientbeta/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="7" + android:versionName="1.2.2_b1"> diff --git a/android/clientbeta/project.properties b/android/clientbeta/project.properties index 60173a6d..ef672900 100644 --- a/android/clientbeta/project.properties +++ b/android/clientbeta/project.properties @@ -8,9 +8,10 @@ # project structure. # Project target. -target=android-17 +target=Google Inc.:Google APIs:17 proguard.config=proguard.cfg android.library.reference.1=../libraries/TweetLanesCore + diff --git a/android/libraries/SocialNetLib/project.properties b/android/libraries/SocialNetLib/project.properties index 42e549fb..04994166 100644 --- a/android/libraries/SocialNetLib/project.properties +++ b/android/libraries/SocialNetLib/project.properties @@ -11,6 +11,6 @@ #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt # Project target. -target=android-17 +target=Google Inc.:Google APIs:17 android.library=true diff --git a/android/libraries/TweetLanesCore/TweetLanesCore.iml b/android/libraries/TweetLanesCore/TweetLanesCore.iml index 8cebb27f..fbd68075 100644 --- a/android/libraries/TweetLanesCore/TweetLanesCore.iml +++ b/android/libraries/TweetLanesCore/TweetLanesCore.iml @@ -21,14 +21,10 @@ - - - - - - - + + + diff --git a/android/libraries/TweetLanesCore/project.properties b/android/libraries/TweetLanesCore/project.properties index b182bff7..74364a5c 100644 --- a/android/libraries/TweetLanesCore/project.properties +++ b/android/libraries/TweetLanesCore/project.properties @@ -12,5 +12,5 @@ android.library=true # Project target. -target=android-17 +target=Google Inc.:Google APIs:17 android.library.reference.1=../SocialNetLib diff --git a/android/libraries/TweetLanesCore/res/xml/changelog.xml b/android/libraries/TweetLanesCore/res/xml/changelog.xml index ded91fc6..b3303f3b 100644 --- a/android/libraries/TweetLanesCore/res/xml/changelog.xml +++ b/android/libraries/TweetLanesCore/res/xml/changelog.xml @@ -1,5 +1,9 @@ + + Feature - Added visual cue to button press when a user favorites a tweet + + Fix - Links in profile descriptions converted from t.co links Fix - Reply when loading profile correction. Show "Tweet @username" diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/ConsumerKeyConstants.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/ConsumerKeyConstants.java index 24030c8b..ae01d036 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/ConsumerKeyConstants.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/ConsumerKeyConstants.java @@ -4,9 +4,9 @@ public class ConsumerKeyConstants { // Create a new key/secret here: https://dev.twitter.com/apps and here: https://account.app.net/developer/app/create/ // Update below, uncomment lines: - //public static final String TWITTER_CONSUMER_KEY = "Put your key here"; - //public static final String TWITTER_CONSUMER_SECRET = "Put your secret here"; - //public static final String APPDOTNET_CONSUMER_KEY = "Put your key here"; - //public static final String APPDOTNET_CONSUMER_SECRET = "Put your secret here"; + public static final String TWITTER_CONSUMER_KEY = "fS3CmDbprWscxzUFe7jWgA"; + public static final String TWITTER_CONSUMER_SECRET = "h53G93wtzTGPIA6FrIHj6MKy7dLOzzshavVsFIG0to"; + public static final String APPDOTNET_CONSUMER_KEY = "Put your key here"; + public static final String APPDOTNET_CONSUMER_SECRET = "Put your secret here"; public static final String CRITTERCISM_APP_ID = "4f6d53e0b093157b43000033"; } From 6b765473130bfa88fbea476d9c19ee2103b4fef2 Mon Sep 17 00:00:00 2001 From: sinisterdragon Date: Wed, 31 Jul 2013 14:33:21 -0500 Subject: [PATCH 012/163] Changed "ChangeLog" and Version properties --- android/client/project.properties | 2 +- android/clientbeta/clientbeta.iml | 8 +------- android/clientbeta/project.properties | 2 +- android/libraries/SocialNetLib/project.properties | 2 +- android/libraries/TweetLanesCore/TweetLanesCore.iml | 8 +------- android/libraries/TweetLanesCore/project.properties | 2 +- .../com/tweetlanes/android/core/ConsumerKeyConstants.java | 8 ++++---- 7 files changed, 10 insertions(+), 22 deletions(-) diff --git a/android/client/project.properties b/android/client/project.properties index 48bb41d9..60173a6d 100644 --- a/android/client/project.properties +++ b/android/client/project.properties @@ -8,7 +8,7 @@ # project structure. # Project target. -target=Google Inc.:Google APIs:17 +target=android-17 proguard.config=proguard.cfg android.library.reference.1=../libraries/TweetLanesCore diff --git a/android/clientbeta/clientbeta.iml b/android/clientbeta/clientbeta.iml index 6ee36c85..174ed9de 100644 --- a/android/clientbeta/clientbeta.iml +++ b/android/clientbeta/clientbeta.iml @@ -4,12 +4,6 @@ @@ -19,7 +13,7 @@ - + diff --git a/android/clientbeta/project.properties b/android/clientbeta/project.properties index ef672900..9d3820d3 100644 --- a/android/clientbeta/project.properties +++ b/android/clientbeta/project.properties @@ -8,7 +8,7 @@ # project structure. # Project target. -target=Google Inc.:Google APIs:17 +target=android-17 proguard.config=proguard.cfg android.library.reference.1=../libraries/TweetLanesCore diff --git a/android/libraries/SocialNetLib/project.properties b/android/libraries/SocialNetLib/project.properties index 04994166..42e549fb 100644 --- a/android/libraries/SocialNetLib/project.properties +++ b/android/libraries/SocialNetLib/project.properties @@ -11,6 +11,6 @@ #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt # Project target. -target=Google Inc.:Google APIs:17 +target=android-17 android.library=true diff --git a/android/libraries/TweetLanesCore/TweetLanesCore.iml b/android/libraries/TweetLanesCore/TweetLanesCore.iml index fbd68075..67667365 100644 --- a/android/libraries/TweetLanesCore/TweetLanesCore.iml +++ b/android/libraries/TweetLanesCore/TweetLanesCore.iml @@ -5,12 +5,6 @@ @@ -20,7 +14,7 @@ - + diff --git a/android/libraries/TweetLanesCore/project.properties b/android/libraries/TweetLanesCore/project.properties index 74364a5c..b182bff7 100644 --- a/android/libraries/TweetLanesCore/project.properties +++ b/android/libraries/TweetLanesCore/project.properties @@ -12,5 +12,5 @@ android.library=true # Project target. -target=Google Inc.:Google APIs:17 +target=android-17 android.library.reference.1=../SocialNetLib diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/ConsumerKeyConstants.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/ConsumerKeyConstants.java index ae01d036..59e5e21c 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/ConsumerKeyConstants.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/ConsumerKeyConstants.java @@ -4,9 +4,9 @@ public class ConsumerKeyConstants { // Create a new key/secret here: https://dev.twitter.com/apps and here: https://account.app.net/developer/app/create/ // Update below, uncomment lines: - public static final String TWITTER_CONSUMER_KEY = "fS3CmDbprWscxzUFe7jWgA"; - public static final String TWITTER_CONSUMER_SECRET = "h53G93wtzTGPIA6FrIHj6MKy7dLOzzshavVsFIG0to"; - public static final String APPDOTNET_CONSUMER_KEY = "Put your key here"; - public static final String APPDOTNET_CONSUMER_SECRET = "Put your secret here"; +// public static final String TWITTER_CONSUMER_KEY = "Put your key here"; +// public static final String TWITTER_CONSUMER_SECRET = "Put your secret here"; +// public static final String APPDOTNET_CONSUMER_KEY = "Put your key here"; +// public static final String APPDOTNET_CONSUMER_SECRET = "Put your secret here"; public static final String CRITTERCISM_APP_ID = "4f6d53e0b093157b43000033"; } From b38d415e2a3f91df1e3e7f7f0a5c707eec6980c9 Mon Sep 17 00:00:00 2001 From: R4md4c Date: Thu, 1 Aug 2013 00:12:26 +0200 Subject: [PATCH 013/163] Fixed Issue #215 Show full URL in the tweet. Used getExpandedURL instead of getDisplayURL Signed-off-by: R4md4c --- .../libraries/SocialNetLib/src/com/twitter/AutolinkEx.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android/libraries/SocialNetLib/src/com/twitter/AutolinkEx.java b/android/libraries/SocialNetLib/src/com/twitter/AutolinkEx.java index 96a8dc14..cfb5bb6b 100755 --- a/android/libraries/SocialNetLib/src/com/twitter/AutolinkEx.java +++ b/android/libraries/SocialNetLib/src/com/twitter/AutolinkEx.java @@ -237,8 +237,8 @@ public void linkToURL(Entity entity, String text, StringBuilder builder, CharSequence url = entity.getValue(); CharSequence linkText = escapeHTML(url); - if (urlEntity != null && urlEntity.getDisplayURL() != null) { - linkText = urlEntity.getDisplayURL(); + if (urlEntity != null && urlEntity.getExpandedURL() != null) { + linkText = urlEntity.getExpandedURL(); } else if (entity.displayURL != null) { linkText = entity.displayURL; } From a6d84e77c427ad0e182d9a455a80bb7b3f137ea8 Mon Sep 17 00:00:00 2001 From: Jason Famularo Date: Wed, 31 Jul 2013 22:32:07 -0400 Subject: [PATCH 014/163] Revert "IntelliJ config files" This reverts commit b9f6f68cdc67d426db7b9240b0cae2b8059ef16e. --- android/client/TweetLanes.iml | 8 +++++++- android/clientbeta/clientbeta.iml | 8 +++++++- android/libraries/SocialNetLib/TL-SocialNetLib.iml | 8 +++++++- android/libraries/TweetLanesCore/TweetLanesCore.iml | 8 +++++++- 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/android/client/TweetLanes.iml b/android/client/TweetLanes.iml index 174ed9de..6ee36c85 100644 --- a/android/client/TweetLanes.iml +++ b/android/client/TweetLanes.iml @@ -4,6 +4,12 @@ @@ -13,7 +19,7 @@ - + diff --git a/android/clientbeta/clientbeta.iml b/android/clientbeta/clientbeta.iml index 174ed9de..6ee36c85 100644 --- a/android/clientbeta/clientbeta.iml +++ b/android/clientbeta/clientbeta.iml @@ -4,6 +4,12 @@ @@ -13,7 +19,7 @@ - + diff --git a/android/libraries/SocialNetLib/TL-SocialNetLib.iml b/android/libraries/SocialNetLib/TL-SocialNetLib.iml index e04eae0e..d0407553 100644 --- a/android/libraries/SocialNetLib/TL-SocialNetLib.iml +++ b/android/libraries/SocialNetLib/TL-SocialNetLib.iml @@ -15,6 +15,12 @@ @@ -25,7 +31,7 @@ - + diff --git a/android/libraries/TweetLanesCore/TweetLanesCore.iml b/android/libraries/TweetLanesCore/TweetLanesCore.iml index f94144c4..8cebb27f 100644 --- a/android/libraries/TweetLanesCore/TweetLanesCore.iml +++ b/android/libraries/TweetLanesCore/TweetLanesCore.iml @@ -5,6 +5,12 @@ @@ -14,7 +20,7 @@ - + From 2de1f9a76964f962693b7825f29df28e917e16de Mon Sep 17 00:00:00 2001 From: Jason Famularo Date: Wed, 31 Jul 2013 22:51:33 -0400 Subject: [PATCH 015/163] Fixing version numbers. --- android/client/AndroidManifest.xml | 2 +- android/clientbeta/AndroidManifest.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/android/client/AndroidManifest.xml b/android/client/AndroidManifest.xml index 3ef03617..f1116739 100644 --- a/android/client/AndroidManifest.xml +++ b/android/client/AndroidManifest.xml @@ -2,7 +2,7 @@ + android:versionName="1.2.1"> diff --git a/android/clientbeta/AndroidManifest.xml b/android/clientbeta/AndroidManifest.xml index 6ef234fb..8ded1215 100644 --- a/android/clientbeta/AndroidManifest.xml +++ b/android/clientbeta/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="8" + android:versionName="1.2.1_b0"> From 57c433ead32b46901b71a0c2fa27472a6b3bcaec Mon Sep 17 00:00:00 2001 From: sinisterdragon Date: Thu, 1 Aug 2013 16:54:38 -0500 Subject: [PATCH 016/163] Added a Light with DarkActionBar theme to be selected from the preferences --- .../TweetLanesCore/res/values/arrays.xml | 2 ++ .../TweetLanesCore/res/values/styles.xml | 34 +++++++++++++++++++ .../tweetlanes/android/core/AppSettings.java | 24 ++++++++++--- .../core/view/TweetSpotlightActivity.java | 6 ++-- 4 files changed, 58 insertions(+), 8 deletions(-) diff --git a/android/libraries/TweetLanesCore/res/values/arrays.xml b/android/libraries/TweetLanesCore/res/values/arrays.xml index 6aca3350..e8f177dd 100644 --- a/android/libraries/TweetLanesCore/res/values/arrays.xml +++ b/android/libraries/TweetLanesCore/res/values/arrays.xml @@ -30,11 +30,13 @@ Holo Light + Holo Light w/ Dark Bar Holo Dark light + light.darkactionbar dark diff --git a/android/libraries/TweetLanesCore/res/values/styles.xml b/android/libraries/TweetLanesCore/res/values/styles.xml index 55e2baac..387be8f2 100644 --- a/android/libraries/TweetLanesCore/res/values/styles.xml +++ b/android/libraries/TweetLanesCore/res/values/styles.xml @@ -33,6 +33,40 @@ + + + + + + + + + + + diff --git a/android/libraries/TweetLanesCore/res/xml/changelog.xml b/android/libraries/TweetLanesCore/res/xml/changelog.xml index deea1550..d6ed5c59 100644 --- a/android/libraries/TweetLanesCore/res/xml/changelog.xml +++ b/android/libraries/TweetLanesCore/res/xml/changelog.xml @@ -2,6 +2,7 @@ Feature - Added a visual cue when favorite button is pressed + Feature - Added Holo Light Dark Actionbar Theme Fix - Links in profile descriptions converted from t.co links Fix - Reply when loading profile correction. Show "Tweet @username" diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java index e48523ca..f848aa43 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java @@ -985,6 +985,10 @@ public View getView(int position, View convertView, ViewGroup parent) { } holder.ScreenName.setText(account.ScreenName, TextView.BufferType.NORMAL); + if(AppSettings.get().getCurrentThemeStyle() == R.style.Theme_TweetLanes_Light_DarkActionBar){ + holder.ScreenName.setTextColor(getResources().getColor(R.color.white)); + } + setProfileImage(account.AvatarImageUrl, account.ServiceType, holder.AvatarImage, holder.ServiceImage); return row; @@ -994,6 +998,7 @@ class AccountData { public AccountData(long id, String screenName, SocialNetConstant.Type serviceType, String avatarImageUrl) { Id = id; ScreenName = screenName; + AvatarImageUrl = avatarImageUrl; ServiceType = serviceType; } @@ -1021,10 +1026,16 @@ private void setProfileImage(String profileImageUrl, SocialNetConstant.Type serv } } else { - int resource = AppSettings.get().getCurrentThemeStyle() == - R.style.Theme_TweetLanes_Light ? - R.drawable.ic_action_user_add : - R.drawable.ic_action_user_add_dark; + int resource; + if(AppSettings.get().getCurrentThemeStyle() == R.style.Theme_TweetLanes_Light_DarkActionBar){ + resource = R.drawable.ic_action_user_add_dark; + }else{ + resource = AppSettings.get().getCurrentThemeStyle() == + R.style.Theme_TweetLanes_Light ? + R.drawable.ic_action_user_add : + R.drawable.ic_action_user_add_dark; + } + avatar.setImageResource(resource); service.setVisibility(View.GONE); } diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index 5978f80e..70a06002 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -1466,13 +1466,25 @@ void setIsFavorited(boolean favorited) { if (mFavoriteMenuItem != null) { boolean isDarkTheme = AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Dark; if (favorited) { - mFavoriteMenuItem.setIcon( - isDarkTheme ? R.drawable.ic_action_star_on_dark : R.drawable.ic_action_star_on_light); - mFavoriteMenuItem.setTitle(R.string.action_unfavorite); + if(AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Light_DarkAction){ + mFavoriteMenuItem.setIcon(R.drawable.ic_action_star_on_dark); + mFavoriteMenuItem.setTitle(R.string.action_unfavorite); + }else{ + mFavoriteMenuItem.setIcon( + isDarkTheme ? R.drawable.ic_action_star_on_dark : R.drawable.ic_action_star_on_light); + mFavoriteMenuItem.setTitle(R.string.action_unfavorite); + } + } else { - mFavoriteMenuItem.setIcon( - isDarkTheme ? R.drawable.ic_action_star_off_dark : R.drawable.ic_action_star_off_light); - mFavoriteMenuItem.setTitle(R.string.action_favorite); + if(AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Light_DarkAction){ + mFavoriteMenuItem.setIcon(R.drawable.ic_action_star_off_dark); + mFavoriteMenuItem.setTitle(R.string.action_favorite); + } else{ + mFavoriteMenuItem.setIcon( + isDarkTheme ? R.drawable.ic_action_star_off_dark : R.drawable.ic_action_star_off_light); + mFavoriteMenuItem.setTitle(R.string.action_favorite); + } + } } } From b257f12eb9f5237bae6cac3c2dca765e9b8c07d4 Mon Sep 17 00:00:00 2001 From: sinisterdragon Date: Fri, 9 Aug 2013 09:12:46 -0500 Subject: [PATCH 039/163] Took out unwanted Style changes --- .../TweetLanesCore/res/values/styles.xml | 22 ------------------- 1 file changed, 22 deletions(-) diff --git a/android/libraries/TweetLanesCore/res/values/styles.xml b/android/libraries/TweetLanesCore/res/values/styles.xml index 871f49b7..387be8f2 100644 --- a/android/libraries/TweetLanesCore/res/values/styles.xml +++ b/android/libraries/TweetLanesCore/res/values/styles.xml @@ -45,9 +45,6 @@ @style/list_background_light @style/status_text_bl @style/free_for_life_background_light - @style/spinnerItemStyle_lightDark - @style/spinnerDropItemStyle_lightDark - @style/ic_action_camera_dark @style/ic_action_collapse_dark @@ -100,25 +97,6 @@ @style/feed_divider_dark - - - - - - - From 763ceb1cbf3b0ff1f22943e2c42358caf7048a6b Mon Sep 17 00:00:00 2001 From: sinisterdragon Date: Fri, 9 Aug 2013 11:07:30 -0500 Subject: [PATCH 040/163] Little bit of Clean up on HomeActivity.java --- .../android/core/view/HomeActivity.java | 38 +++++++------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java index f848aa43..cd891cfe 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java @@ -79,10 +79,10 @@ public class HomeActivity extends BaseLaneActivity { - HomeLaneAdapter mHomeLaneAdapter; - SpinnerAdapter mSpinnerAdapter; - ViewSwitcher mViewSwitcher; - FinishedCallback mFetchListsCallback; + private HomeLaneAdapter mHomeLaneAdapter; + private SpinnerAdapter mSpinnerAdapter; + private ViewSwitcher mViewSwitcher; + private FinishedCallback mFetchListsCallback; private OnNavigationListener mOnNavigationListener; private Integer mDefaultLaneOverride = null; @@ -208,7 +208,7 @@ void onCreateHandleIntents() { Bundle extras = intent.getExtras(); String type = intent.getType(); - if (type.equals("text/plain") == true) { + if (type.equals("text/plain")) { String shareString = extras.getString(Intent.EXTRA_TEXT); if (extras.containsKey(Intent.EXTRA_TEXT)) { @@ -221,7 +221,7 @@ void onCreateHandleIntents() { } else if (type.contains("image/")) { // From http://stackoverflow.com/a/2641363/328679 if (extras.containsKey(Intent.EXTRA_STREAM)) { - Uri uri = (Uri) extras.getParcelable(Intent.EXTRA_STREAM); + Uri uri =extras.getParcelable(Intent.EXTRA_STREAM); String scheme = uri.getScheme(); if (scheme.equals("content")) { ContentResolver contentResolver = getContentResolver(); @@ -243,7 +243,7 @@ void onCreateHandleIntents() { } } - if (turnSoftKeyboardOff == true) { + if (turnSoftKeyboardOff) { // Turn the soft-keyboard off. For some reason it wants to appear on // screen by default when coming back from multitasking... getWindow().setSoftInputMode( @@ -267,13 +267,13 @@ protected void onResume() { account.setDisplayedLaneDefinitionsDirty(false); } - if (account.shouldRefreshLists() == true) { + if (account.shouldRefreshLists()) { mRefreshListsHandler.removeCallbacks(mRefreshListsTask); mRefreshListsHandler.postDelayed(mRefreshListsTask, Constant.REFRESH_LISTS_WAIT_TIME); } - if (isComposing() == false) { + if (!isComposing()) { // Check we are using List navigation on the ActionBar. This will // not be the case when ComposeTweet is present. if (getActionBar().getNavigationMode() == android.app.ActionBar.NAVIGATION_MODE_LIST) { @@ -347,7 +347,7 @@ protected int getInitialLaneIndex() { @Override String getCachedData(int laneIndex) { - if (Constant.ENABLE_STATUS_CACHING == true) { + if (Constant.ENABLE_STATUS_CACHING) { AccountDescriptor account = getApp().getCurrentAccount(); @@ -485,7 +485,7 @@ public Integer getDefaultOptionsMenu() { @Override public boolean onOptionsItemSelected(MenuItem item) { - if (super.onOptionsItemSelected(item) == true) { + if (super.onOptionsItemSelected(item)) { return true; } @@ -631,7 +631,7 @@ private void showAddAccount() { /* * */ - public void showUserPreferences() { + void showUserPreferences() { startActivity(new Intent(this, SettingsActivity.class)); } @@ -771,16 +771,6 @@ public void finished(TwitterFetchResult result, }, null); } - /** - * A call-back for when the user presses the back button. - */ - OnClickListener mBackListener = new OnClickListener() { - - public void onClick(View v) { - finish(); - } - }; - /* * Hanlder for refreshing a user's lists */ @@ -795,9 +785,9 @@ public void run() { public void finished(boolean successful, TwitterLists lists) { mFetchListsCallback = null; - if (successful == true) { + if (successful) { boolean modified = getApp().onUserListsRefresh(lists); - if (modified == true) { + if (modified) { onLaneDataSetChanged(); } } From 3da4867b6a0ef016c1a78b2d4fa530f83c6ffca2 Mon Sep 17 00:00:00 2001 From: sinisterdragon Date: Fri, 9 Aug 2013 11:22:00 -0500 Subject: [PATCH 041/163] Removed Unused methods and removed redundant comments in HomeActivity.java --- .../android/core/view/HomeActivity.java | 184 +----------------- 1 file changed, 2 insertions(+), 182 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java index cd891cfe..65fd456f 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java @@ -14,11 +14,8 @@ import android.app.ActionBar; import android.app.ActionBar.OnNavigationListener; import android.app.Activity; -import android.app.AlertDialog; -import android.app.Dialog; import android.content.ContentResolver; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.database.Cursor; import android.net.Uri; @@ -34,7 +31,6 @@ import android.view.Menu; import android.view.MenuItem; import android.view.View; -import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.ImageView; @@ -62,12 +58,9 @@ import org.tweetalib.android.TwitterFetchLists.FinishedCallback; import org.tweetalib.android.TwitterFetchResult; import org.tweetalib.android.TwitterFetchUser; -import org.tweetalib.android.TwitterFetchUsers; import org.tweetalib.android.TwitterManager; import org.tweetalib.android.TwitterPaging; import org.tweetalib.android.model.TwitterLists; -import org.tweetalib.android.model.TwitterStatus; -import org.tweetalib.android.model.TwitterStatusUpdate; import org.tweetalib.android.model.TwitterUser; import org.tweetalib.android.model.TwitterUsers; @@ -196,9 +189,6 @@ void clearTempFolder(){ } - /* - * - */ void onCreateHandleIntents() { boolean turnSoftKeyboardOff = true; @@ -272,20 +262,6 @@ protected void onResume() { mRefreshListsHandler.postDelayed(mRefreshListsTask, Constant.REFRESH_LISTS_WAIT_TIME); } - - if (!isComposing()) { - // Check we are using List navigation on the ActionBar. This will - // not be the case when ComposeTweet is present. - if (getActionBar().getNavigationMode() == android.app.ActionBar.NAVIGATION_MODE_LIST) { - /* - * Integer accountIndex = - * mSpinnerAdapter.getIndexOfAccount(getApp - * ().getCurrentAccount()); if (accountIndex != null) { - * getActionBar().setSelectedNavigationItem(accountIndex); } - */ - } - } - getApp().clearImageCaches(); } @@ -341,9 +317,6 @@ protected int getInitialLaneIndex() { return account.getInitialLaneIndex(); } - /* - * - */ @Override String getCachedData(int laneIndex) { @@ -411,9 +384,6 @@ protected void onLaneChange(final int position, final int oldPosition) { saveData(oldPosition); } - /* - * - */ private void saveData(final int position) { final App app = getApp(); @@ -443,9 +413,6 @@ public void run() { }).start(); } - /* - * - */ private void updateViewVisibility() { mViewSwitcher.reset(); mViewSwitcher.setDisplayedChild(1); @@ -499,28 +466,6 @@ public boolean onOptionsItemSelected(MenuItem item) { Uri.parse("https://play.google.com/store/apps/details?id=com.chrislacy.actionlauncher.pro")); startActivity(browserIntent); - - /* - * case R.id.action_promote: showPromote(); break; - */ - - /* - * case CHOOSE_LANES: Toast.makeText(getApplicationContext(), - * getString(R.string.functionality_not_implemented), - * Constant.DEFAULT_TOAST_DISPLAY_TIME).show(); break; - */ - - /* - * case R.id.action_send_feedback: Intent intent = new - * Intent(Intent.ACTION_SEND); intent.setType("plain/text"); String - * recipient[] = {"lacy@tweetlanes.com"}; - * intent.putExtra(Intent.EXTRA_EMAIL, recipient); - * intent.putExtra(Intent.EXTRA_SUBJECT, "Tweet Lanes Feedback"); - * //String userScreenName = getApp().getCurrentAccountScreenName(); - * //intent.putExtra(Intent.EXTRA_TEXT, userScreenName != null ? - * "(Feedback sent by @" + userScreenName : ""); startActivity(intent); - * break; - */ } else { return false; } @@ -528,9 +473,6 @@ public boolean onOptionsItemSelected(MenuItem item) { return false; } - /* - * - */ void onCreateNavigationListener() { mOnNavigationListener = new OnNavigationListener() { @@ -553,9 +495,6 @@ public boolean onNavigationItemSelected(int position, long itemId) { }; } - /* - * - */ private boolean configureListNavigation() { if (mSpinnerAdapter == null) { @@ -583,9 +522,6 @@ private boolean configureListNavigation() { return true; } - /* - * - */ private void showAccount(AccountDescriptor selectedAccount, Constant.LaneType lane) { App app = getApp(); @@ -621,126 +557,14 @@ private void showAccount(AccountDescriptor selectedAccount, Constant.LaneType la } } - /* - * - */ private void showAddAccount() { startActivity(new Intent(this, NewAccountActivity.class)); } - /* - * - */ void showUserPreferences() { startActivity(new Intent(this, SettingsActivity.class)); } - /* - * - */ - private void showFreeForLifeSuccess() { - AlertDialog.Builder builder = new AlertDialog.Builder(HomeActivity.this); - - builder.setMessage(getString(R.string.free_for_life_success)); - builder.setTitle(getString(R.string.success)); - builder.setIcon(android.R.drawable.btn_star_big_on); - - builder.setPositiveButton("OK", new Dialog.OnClickListener() { - - @Override - public void onClick(DialogInterface arg0, int arg1) { - - } - - }); - - builder.create().show(); - } - - /* - * - */ - private void showFreeForLifeError() { - AlertDialog.Builder builder = new AlertDialog.Builder(HomeActivity.this); - - builder.setMessage(getString(R.string.free_for_life_error)); - builder.setIcon(0); - - builder.setPositiveButton("OK", new Dialog.OnClickListener() { - - @Override - public void onClick(DialogInterface arg0, int arg1) { - - } - - }); - } - - /* - * - */ - public void showPromote() { - final View layout = View.inflate(this, R.layout.promote, null); - - // final EditText promoStatus = ((EditText) - // layout.findViewById(R.id.promoStatusEditText)); - // promoStatus.setText(R.string.free_for_life_promo_status); - - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setIcon(0); - - builder.setPositiveButton("Agree!", new Dialog.OnClickListener() { - - public void onClick(DialogInterface dialog, int which) { - - TwitterFetchUsers.FinishedCallback callback = TwitterManager - .get().getFetchUsersInstance().new FinishedCallback() { - - @Override - public void finished(TwitterFetchResult result, - TwitterUsers users) { - - if (result.isSuccessful()) { - - String statusText = getString(R.string.promote_status_text); - TwitterStatusUpdate statusUpdate = new TwitterStatusUpdate( - statusText); - - TwitterManager - .get() - .setStatus( - statusUpdate, - TwitterManager.get() - .getFetchStatusInstance().new FinishedCallback() { - - @Override - public void finished( - TwitterFetchResult result, - TwitterStatus status) { - - if (result.isSuccessful()) { - showFreeForLifeSuccess(); - } else { - showFreeForLifeError(); - } - } - }); - } - - } - }; - - getApp().triggerFollowPromoAccounts(callback); - } - }); - builder.setNegativeButton("Cancel", null); - builder.setView(layout); - builder.setTitle("Promote Tweet Lanes!"); - - AlertDialog alertDialog = builder.create(); - alertDialog.show(); - } - private void cacheFollowers() { AccountDescriptor account = getApp().getCurrentAccount(); @@ -801,9 +625,7 @@ public void finished(boolean successful, TwitterLists lists) { } }; - /* - * - */ + void onLaneDataSetChanged() { if (mHomeLaneAdapter != null) { mHomeLaneAdapter.notifyDataSetChanged(); @@ -814,9 +636,7 @@ void onLaneDataSetChanged() { getApp().getCurrentAccount().setDisplayedLaneDefinitionsDirty(false); } - /* - * - */ + class HomeLaneAdapter extends FragmentStatePagerAdapter implements TitleProvider { From 897d22dcbc04e97076aa58481c1b1c3234c3403c Mon Sep 17 00:00:00 2001 From: Jason Famularo Date: Fri, 9 Aug 2013 21:28:06 -0400 Subject: [PATCH 042/163] Revert "Using higher resolution user profile images." This reverts commit 15bc2248389a0b31f5b3abda5122dbe3b1193003. --- .../tweetalib/android/model/TwitterUser.java | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterUser.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterUser.java index fabfb8fc..270e6568 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterUser.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterUser.java @@ -36,20 +36,20 @@ public TwitterUser(User user) { mUrl = user.getURL().toString(); } - if (user.getOriginalProfileImageURL() != null) { - mProfileImageUrlOriginal = user.getOriginalProfileImageURL().toString(); + if (user.getOriginalProfileImageURLHttps() != null) { + mProfileImageUrlOriginal = user.getOriginalProfileImageURLHttps().toString(); } - if (user.getBiggerProfileImageURL() != null) { - mProfileImageUrlBigger = user.getBiggerProfileImageURL().toString(); + if (user.getBiggerProfileImageURLHttps() != null) { + mProfileImageUrlBigger = user.getBiggerProfileImageURLHttps().toString(); } - if (user.getBiggerProfileImageURL() != null) { - mProfileImageUrlNormal = user.getBiggerProfileImageURL().toString(); + if (user.getProfileImageURLHttps() != null) { + mProfileImageUrlNormal = user.getProfileImageURLHttps().toString(); } - if (user.getProfileImageURL() != null) { - mProfileImageUrlMini = user.getProfileImageURL().toString(); + if (user.getMiniProfileImageURLHttps() != null) { + mProfileImageUrlMini = user.getMiniProfileImageURLHttps().toString(); } mStatusesCount = user.getStatusesCount(); @@ -63,7 +63,6 @@ public TwitterUser(User user) { } public TwitterUser(AdnUser user) { - mId = user.mId; mScreenName = user.mUserName; mName = user.mName; @@ -76,9 +75,9 @@ public TwitterUser(AdnUser user) { mCurrentUserFollows = user.mCurrentUserFollows; mFollowsCurrentUser = user.mFollowsCurrentUser; mFavoritesCount = user.mFavoritesCount; - mProfileImageUrlMini = "https://alpha-api.app.net/stream/0/users/@" + user.mUserName + "/avatar?w=64"; - mProfileImageUrlNormal = "https://alpha-api.app.net/stream/0/users/@" + user.mUserName + "/avatar?w=96"; - mProfileImageUrlBigger = "https://alpha-api.app.net/stream/0/users/@" + user.mUserName + "/avatar?w=144"; + mProfileImageUrlMini = "https://alpha-api.app.net/stream/0/users/@" + user.mUserName + "/avatar?w=32"; + mProfileImageUrlNormal = "https://alpha-api.app.net/stream/0/users/@" + user.mUserName + "/avatar?w=48"; + mProfileImageUrlBigger = "https://alpha-api.app.net/stream/0/users/@" + user.mUserName + "/avatar?w=73"; mProfileImageUrlOriginal = "https://alpha-api.app.net/stream/0/users/@" + user.mUserName + "/avatar"; } @@ -90,8 +89,8 @@ public TwitterUser(TwitterUser user) { mDescriptionUrlEntities = user.getDescriptionUrlEntities(); mLocation = user.getLocation(); mUrl = user.getUrl(); - mProfileImageUrlMini = user.getProfileImageUrlNormal(); - mProfileImageUrlNormal = user.getProfileImageUrlBigger(); + mProfileImageUrlMini = user.getProfileImageUrlMini(); + mProfileImageUrlNormal = user.getProfileImageUrlNormal(); mProfileImageUrlBigger = user.getProfileImageUrlBigger(); mProfileImageUrlOriginal = user.getProfileImageUrlOriginal(); From 8bbc43bcaab0462f75c9e142f4a0be976e6ce98d Mon Sep 17 00:00:00 2001 From: sinisterdragon Date: Mon, 12 Aug 2013 08:48:07 -0500 Subject: [PATCH 043/163] Fixed Send icon and Profile Text Color in Holo.Light.DarkActionBar --- android/libraries/TweetLanesCore/res/values/styles.xml | 2 +- .../com/tweetlanes/android/core/view/ProfileActivity.java | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/android/libraries/TweetLanesCore/res/values/styles.xml b/android/libraries/TweetLanesCore/res/values/styles.xml index 387be8f2..8ae9708c 100644 --- a/android/libraries/TweetLanesCore/res/values/styles.xml +++ b/android/libraries/TweetLanesCore/res/values/styles.xml @@ -56,7 +56,7 @@ @style/ic_action_save_dark @style/ic_action_select_image_dark @style/ic_action_search_dark - @style/ic_action_send_dark + @style/ic_action_send_light @style/ic_action_share_dark @style/ic_action_star_on_dark @style/ic_action_star_off_dark diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ProfileActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ProfileActivity.java index e7fd1291..b970f876 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ProfileActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ProfileActivity.java @@ -11,6 +11,7 @@ package com.tweetlanes.android.core.view; +import com.tweetlanes.android.core.AppSettings; import org.tweetalib.android.TwitterFetchResult; import org.tweetalib.android.TwitterFetchUser; import org.tweetalib.android.TwitterManager; @@ -68,6 +69,8 @@ protected void onCreate(Bundle savedInstanceState) { .replace("@", ""); } + + if (mScreenName == null) { restartApp(); return; @@ -234,6 +237,10 @@ boolean configureActionBarView() { ((TextView) profileTitleView.findViewById(R.id.screenname)) .setText("@" + mScreenName); + if(AppSettings.get().getCurrentThemeStyle() == R.style.Theme_TweetLanes_Light_DarkActionBar){ + ((TextView) profileTitleView.findViewById(R.id.screenname)).setTextColor(getResources().getColor(R.color.white)); + } + TextView fullNameTextView = (TextView) profileTitleView .findViewById(R.id.fullname); if (fullNameTextView != null && mUser != null) { From 81a29dc3a93b7f65155b49bd8ee2b24afea3eb5b Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Tue, 13 Aug 2013 17:38:59 +0100 Subject: [PATCH 044/163] fix for #232 to use the display url rather than the expanded url. --- .../src/com/twitter/Autolink.java | 17 ++++++++------- .../org/tweetalib/android/TwitterUtil.java | 21 ++++++++----------- .../android/model/TwitterDirectMessage.java | 2 +- .../android/model/TwitterStatus.java | 4 ++-- 4 files changed, 21 insertions(+), 23 deletions(-) diff --git a/android/libraries/SocialNetLib/src/com/twitter/Autolink.java b/android/libraries/SocialNetLib/src/com/twitter/Autolink.java index 2d91a7ad..76ff274d 100644 --- a/android/libraries/SocialNetLib/src/com/twitter/Autolink.java +++ b/android/libraries/SocialNetLib/src/com/twitter/Autolink.java @@ -2,11 +2,12 @@ import com.twitter.Extractor.Entity; +import org.tweetalib.android.model.TwitterMediaEntity; + import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import org.tweetalib.android.model.TwitterMediaEntity; import twitter4j.MediaEntity; import twitter4j.URLEntity; @@ -66,7 +67,7 @@ private static CharSequence escapeHTML(CharSequence text) { public Autolink() { usernameUrlBase = "com.tweetlanes.android.core.profile://"; listUrlBase = "com.tweetlanes.android.core.profile://"; - hashtagUrlBase = "com.tweetlanes.android.core.search://"; + hashtagUrlBase = "com.tweetlanes.android.core.search://"; cashtagUrlBase = "com.tweetlanes.android.core.search://"; extractor.setExtractURLWithoutProtocol(false); } @@ -167,7 +168,9 @@ void linkToURL(Entity entity, String text, StringBuilder builder, CharSequence url = entity.getValue(); CharSequence linkText = escapeHTML(url); - if (urlEntity != null && urlEntity.getExpandedURL() != null) { + if (urlEntity != null && urlEntity.getDisplayURL() != null) { + linkText = urlEntity.getDisplayURL(); + } else if (urlEntity != null && urlEntity.getExpandedURL() != null) { linkText = urlEntity.getExpandedURL(); } else if (entity.displayURL != null) { linkText = entity.displayURL; @@ -179,8 +182,7 @@ void linkToURL(Entity entity, String text, StringBuilder builder, linkToText(entity, linkText, attrs, builder); } - String autoLinkEntities(String text, - TwitterMediaEntity twitterMediaEntity, List entities, + String autoLinkEntities(String text, List entities, MediaEntity[] mediaEntities, URLEntity[] urlEntities) { StringBuilder builder = new StringBuilder(text.length() * 2); int beginIndex = 0; @@ -231,14 +233,13 @@ String autoLinkEntities(String text, return builder.toString(); } - public String autoLinkAll(String text, - TwitterMediaEntity twitterMediaEntity, MediaEntity[] mediaEntities, + public String autoLinkAll(String text, MediaEntity[] mediaEntities, URLEntity[] urlEntities) { text = escapeBrackets(text); // extract entities List entities = extractor.extractEntitiesWithIndices(text); - return autoLinkEntities(text, twitterMediaEntity, entities, + return autoLinkEntities(text, entities, mediaEntities, urlEntities); } } diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterUtil.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterUtil.java index 02f26050..98e3fa4d 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterUtil.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterUtil.java @@ -20,6 +20,7 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; +import java.util.Map; import org.appdotnet4j.model.AdnPost; import org.tweetalib.android.model.TwitterMediaEntity; @@ -52,38 +53,34 @@ public static String stripMarkup(String text) { } public static String getTextMarkup(String text, URLEntity[] urlEntities) { - return getStatusMarkup(text, null, null, urlEntities); + return getStatusMarkup(text, null, urlEntities); } /* * return the markup for a status, which replaces t.co/ links with the * visible links */ - public static String getStatusMarkup(Status status, - TwitterMediaEntity twitterMediaEntity) { - return getStatusMarkup(status.getText(), twitterMediaEntity, - status.getMediaEntities(), status.getURLEntities()); + public static String getStatusMarkup(Status status) { + return getStatusMarkup(status.getText(),status.getMediaEntities(), status.getURLEntities()); } /* * */ - public static String getStatusMarkup(AdnPost post, - TwitterMediaEntity mediaEntity) { - return getStatusMarkup(post.mText, mediaEntity, null, null); + public static String getStatusMarkup(AdnPost post) { + + return getStatusMarkup(post.mText, null, null); } /* * */ - public static String getStatusMarkup(String statusText, - TwitterMediaEntity twitterMediaEntity, MediaEntity[] mediaEntities, + public static String getStatusMarkup(String statusText, MediaEntity[] mediaEntities, URLEntity[] urlEntities) { initCommon(); - return mAutoLink.autoLinkAll(statusText, - twitterMediaEntity, mediaEntities, urlEntities); + return mAutoLink.autoLinkAll(statusText, mediaEntities, urlEntities); } /* diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterDirectMessage.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterDirectMessage.java index 0dd39fd2..94f430a7 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterDirectMessage.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterDirectMessage.java @@ -43,7 +43,7 @@ public TwitterDirectMessage(DirectMessage message, User otherUser) { : MessageType.RECEIVED; mText = message.getText(); TwitterMediaEntity mediaEntity = TwitterMediaEntity.createMediaEntity(message); - String descriptionMarkup = TwitterUtil.getStatusMarkup(mText,mediaEntity, message.getMediaEntities() ,message.getURLEntities()); + String descriptionMarkup = TwitterUtil.getStatusMarkup(mText,message.getMediaEntities() ,message.getURLEntities()); mTextSpanned = Html.fromHtml(descriptionMarkup + " "); mCreatedAt = message.getCreatedAt(); mOtherUserId = otherUser.getId(); diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatus.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatus.java index e5fedfd7..8fe4109e 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatus.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatus.java @@ -646,7 +646,7 @@ public boolean isEqualTo(TwitterStatus other) { * */ void setStatusMarkup(Status status) { - mStatusFullMarkup = TwitterUtil.getStatusMarkup(status, mMediaEntity); + mStatusFullMarkup = TwitterUtil.getStatusMarkup(status); mStatusFullSpanned = URLSpanNoUnderline.stripUnderlines(Html .fromHtml(mStatusFullMarkup.replace("\n", "
") + " ")); } @@ -661,7 +661,7 @@ void setStatusMarkup(String full) { } void setStatusMarkup(AdnPost post) { - mStatusFullMarkup = TwitterUtil.getStatusMarkup(post, mMediaEntity); + mStatusFullMarkup = TwitterUtil.getStatusMarkup(post); mStatusFullSpanned = URLSpanNoUnderline.stripUnderlines(Html .fromHtml(mStatusFullMarkup.replace("\n", "
") + " ")); } From e8f41e88937d7ae9363513478e7cca7e9f911330 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Tue, 13 Aug 2013 18:47:20 +0100 Subject: [PATCH 045/163] Fix for #234 - move clear compose on return intent & also added it to the destroy of profile activity --- .../android/core/view/BaseLaneActivity.java | 5 ++++- .../android/core/view/ProfileActivity.java | 21 +++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java index 47ae4779..446a2a5d 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java @@ -1049,8 +1049,10 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { fragment.UpdateTweetCache(status, deleteStatus); } - clearCompose(); + } + + clearCompose(); } else if( requestCode == Constant.REQUEST_CODE_PROFILE ) { clearCompose(); } @@ -1157,6 +1159,7 @@ public boolean onOptionsItemSelected(MenuItem item) { int i = item.getItemId(); if (i == android.R.id.home) { if (composeReleaseFocus(false)) { + clearCompose(); return true; } diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ProfileActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ProfileActivity.java index 03402e4d..b67b3c21 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ProfileActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ProfileActivity.java @@ -60,6 +60,12 @@ protected void onCreate(Bundle savedInstanceState) { setResult(RESULT_OK, returnIntent); String clearCompose = getIntent().getStringExtra("clearCompose"); + boolean savedStateRecreate = false; + if(savedInstanceState != null && savedInstanceState.containsKey("Recreate")) + { + savedStateRecreate = savedInstanceState.getBoolean("Recreate"); + } + mScreenName = getIntent().getStringExtra("userScreenName"); if (mScreenName == null) { Uri data = getIntent().getData(); @@ -77,7 +83,7 @@ protected void onCreate(Bundle savedInstanceState) { super.setCurrentComposeFragment((fragment instanceof DirectMessageFeedFragment) ? super.COMPOSE_DIRECT_MESSAGE : super.COMPOSE_TWEET); - if(clearCompose != null && clearCompose.equals("true")) + if((clearCompose != null && clearCompose.equals("true")) && !savedStateRecreate) { clearCompose(); getIntent().removeExtra("clearCompose"); @@ -123,6 +129,12 @@ public void finished(TwitterFetchResult result, TwitterUser user) { setComposeDefault(); } + @Override + protected void onSaveInstanceState(Bundle bundle) { + super.onSaveInstanceState(bundle); + bundle.putBoolean("Recreate", true); + } + /* * (non-Javadoc) * @@ -135,7 +147,7 @@ protected void onDestroy() { // destroyed, yet a callback is still initiated from a Twitter fetch // operation. A better solution is needed here, but this works for now. mProfileAdapter = null; - + super.onDestroy(); } @@ -279,6 +291,11 @@ public boolean onOptionsItemSelected(MenuItem item) { } } + @Override + public void onBackPressed() { + super.onBackPressed(); + clearCompose(); + } /* * */ From 926eda2c113b74fca8f5a1c05db8ad57b0652edc Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Tue, 13 Aug 2013 20:28:43 +0100 Subject: [PATCH 046/163] Potential fix for #187 Also reduced page size down to 50. Now we only say the refresh finished when there isn't more to get. When there is more, we get them (in the same way we did before) --- .../src/org/tweetalib/android/TwitterPaging.java | 2 +- .../android/core/view/TweetFeedFragment.java | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterPaging.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterPaging.java index 5dd07d98..1813189c 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterPaging.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterPaging.java @@ -22,7 +22,7 @@ public class TwitterPaging { - public static final int DEFAULT_STATUS_COUNT = 100; + public static final int DEFAULT_STATUS_COUNT = 50; /* * diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index 04649429..eb571c2e 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -234,7 +234,8 @@ void fetchNewestTweets() { * */ void fetchNewestTweets(final long sinceStatusId, Long maxStatusId) { - if (mTweetDataRefreshCallback == null) { + if (mTweetDataRefreshCallback == null) + { mTweetDataRefreshCallback = new TwitterFetchStatusesFinishedCallback() { @Override @@ -245,18 +246,18 @@ public void finished(TwitterFetchResult fetchResult, TwitterStatuses feed, return; } - beginListHeadingCount(); - - onRefreshFinished(fetchResult, feed); mTweetDataRefreshCallback = null; if (fetchResult.isSuccessful()) { // If there are more statuses to get, go get 'em if (feed != null && feed.getNewStatusesMaxId() != null) { fetchNewestTweets(sinceStatusId, feed.getNewStatusesMaxId()); - // Log.d("Statuses", "Fetching more"); - } else { - // Log.d("Statuses", "DONE!!!"); + } + else + { + beginListHeadingCount(); + + onRefreshFinished(fetchResult, feed); } } } From 59a7b08d90d606b47ddab01d7dc415111acea196 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Tue, 13 Aug 2013 21:11:48 +0100 Subject: [PATCH 047/163] Added my changes to the change log --- android/libraries/TweetLanesCore/res/xml/changelog.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/android/libraries/TweetLanesCore/res/xml/changelog.xml b/android/libraries/TweetLanesCore/res/xml/changelog.xml index 85a56d90..71a87e14 100644 --- a/android/libraries/TweetLanesCore/res/xml/changelog.xml +++ b/android/libraries/TweetLanesCore/res/xml/changelog.xml @@ -2,10 +2,14 @@ Feature - Added a visual cue when favorite button is pressed - Fix - Links are now shown in full, rather than a "display link" Feature - Added Holo Light Dark Actionbar Theme + Fix - Links are now shown in full, rather than a "display link" Fix - Links in profile descriptions converted from t.co links Fix - Reply when loading profile correction. Show "Tweet @username" + Fix - Correct issues around compose box after loading profile + Fix - Use the t.co display url, rather than expanded url. These are formatted nicer + Fix - Fix issue when more than 1 page of tweets. Fetch only completes when all tweets collected preventing feed jumping + Other - Large codebase tidy-up - hopefully small improvement to performance, size and reliability Feature - Auto complete of @mentions and #hashtags From 7a712a334751a59b81dbfafd7f99a5c1af4bba18 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Wed, 14 Aug 2013 11:31:55 +0100 Subject: [PATCH 048/163] Changed some of the logic around. Could still get odd recursion issues --- .../src/org/asynctasktex/AsyncTaskEx.java | 2 +- .../org/tweetalib/android/TwitterPaging.java | 2 +- .../android/core/view/TweetFeedFragment.java | 42 ++++++++----------- 3 files changed, 19 insertions(+), 27 deletions(-) diff --git a/android/libraries/SocialNetLib/src/org/asynctasktex/AsyncTaskEx.java b/android/libraries/SocialNetLib/src/org/asynctasktex/AsyncTaskEx.java index 091ff797..f464b55b 100644 --- a/android/libraries/SocialNetLib/src/org/asynctasktex/AsyncTaskEx.java +++ b/android/libraries/SocialNetLib/src/org/asynctasktex/AsyncTaskEx.java @@ -233,7 +233,7 @@ public abstract class AsyncTaskEx { private static final String LOG_TAG = "AsyncTask"; - private static final int CORE_POOL_SIZE = 5; + private static final int CORE_POOL_SIZE = 10; private static final int MAXIMUM_POOL_SIZE = 128; private static final int KEEP_ALIVE = 1; diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterPaging.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterPaging.java index 1813189c..5dd07d98 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterPaging.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterPaging.java @@ -22,7 +22,7 @@ public class TwitterPaging { - public static final int DEFAULT_STATUS_COUNT = 50; + public static final int DEFAULT_STATUS_COUNT = 100; /* * diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index eb571c2e..41cadf45 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -234,6 +234,8 @@ void fetchNewestTweets() { * */ void fetchNewestTweets(final long sinceStatusId, Long maxStatusId) { + + if (mTweetDataRefreshCallback == null) { mTweetDataRefreshCallback = new TwitterFetchStatusesFinishedCallback() { @@ -250,15 +252,21 @@ public void finished(TwitterFetchResult fetchResult, TwitterStatuses feed, if (fetchResult.isSuccessful()) { // If there are more statuses to get, go get 'em + boolean doneGettingStatus = true; + if (feed != null && feed.getNewStatusesMaxId() != null) { - fetchNewestTweets(sinceStatusId, feed.getNewStatusesMaxId()); + doneGettingStatus = false; } - else + + if(doneGettingStatus) { beginListHeadingCount(); - onRefreshFinished(fetchResult, feed); } + else + { + fetchNewestTweets(sinceStatusId, feed.getNewStatusesMaxId()); + } } } }; @@ -272,6 +280,11 @@ public void finished(TwitterFetchResult fetchResult, TwitterStatuses feed, getBaseLaneActivity().finishCurrentActionMode(); } } + else + { + mTweetFeedListView.setRefreshing(); + } + } /* @@ -444,28 +457,7 @@ boolean configureCachedStatuses() { * com.tweetlanes.android.core.view.BaseLaneFragment#triggerInitialDownload() */ public void triggerInitialDownload() { - mTweetDataRefreshCallback = new TwitterFetchStatusesFinishedCallback() { - - @Override - public void finished(TwitterFetchResult fetchResult, TwitterStatuses feed, TwitterContentHandle handle) { - if (!handle.getCurrentAccountKey().equals(getApp().getCurrentAccountKey())) { - Log.e("Statuses", "account changed, don't display statuses"); - return; - } - - - if (feed != null) { - setStatusFeed(feed, true); - } - updateViewVisibility(true); - setInitialDownloadState(InitialDownloadState.DOWNLOADED); - mTweetDataRefreshCallback = null; - } - }; - - Log.d("api-call", "--triggerInitialDownload((" + mContentHandle.getStatusesType().toString() + ")"); - TwitterManager.get() - .triggerFetchStatuses(mContentHandle, null, mTweetDataRefreshCallback, getAsyncTaskPriorityOffset()); + fetchNewestTweets(); setInitialDownloadState(InitialDownloadState.DOWNLOADING); } From 5d14fb861aad7b542695520fbac04e09d0d0f301 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Fri, 16 Aug 2013 14:35:20 +0100 Subject: [PATCH 049/163] Reverting some of previous commit in the inital download & changing some of the prioritisation around --- .../src/org/asynctasktex/AsyncTaskEx.java | 5 ++-- .../fetch/TwitterFetchDirectMessages.java | 4 +-- .../android/fetch/TwitterFetchStatuses.java | 2 +- .../android/core/view/TweetFeedFragment.java | 28 ++++++++++++++++++- 4 files changed, 33 insertions(+), 6 deletions(-) diff --git a/android/libraries/SocialNetLib/src/org/asynctasktex/AsyncTaskEx.java b/android/libraries/SocialNetLib/src/org/asynctasktex/AsyncTaskEx.java index f464b55b..ba4b5be7 100644 --- a/android/libraries/SocialNetLib/src/org/asynctasktex/AsyncTaskEx.java +++ b/android/libraries/SocialNetLib/src/org/asynctasktex/AsyncTaskEx.java @@ -233,7 +233,7 @@ public abstract class AsyncTaskEx { private static final String LOG_TAG = "AsyncTask"; - private static final int CORE_POOL_SIZE = 10; + private static final int CORE_POOL_SIZE = 5; private static final int MAXIMUM_POOL_SIZE = 128; private static final int KEEP_ALIVE = 1; @@ -245,7 +245,8 @@ public abstract class AsyncTaskEx { public static final int PRIORITY_LOW = 1; public static final int PRIORITY_MEDIUM = 2; public static final int PRIORITY_HIGH = 3; - public static final int PRIORITY_HIGHEST = 7; + public static final int PRIORITY_NOT_QUITE_HIGHEST = 4; + public static final int PRIORITY_HIGHEST = 5; private static final ThreadFactory sThreadFactory = new ThreadFactory() { private final AtomicInteger mCount = new AtomicInteger(1); diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/fetch/TwitterFetchDirectMessages.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/fetch/TwitterFetchDirectMessages.java index 126b2fd5..876ff541 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/fetch/TwitterFetchDirectMessages.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/fetch/TwitterFetchDirectMessages.java @@ -147,7 +147,7 @@ public TwitterDirectMessages getDirectMessages( } mFinishedCallbackMap.put(mFetchMessagesCallbackHandle, callback); - new FetchStatusesTask().execute(AsyncTaskEx.PRIORITY_MEDIUM, + new FetchStatusesTask().execute(AsyncTaskEx.PRIORITY_HIGH, "Fetch DMs", new FetchDirectMessagesTaskInput( mFetchMessagesCallbackHandle, contentHandle, paging, connectionStatus)); @@ -172,7 +172,7 @@ public void sendDirectMessage(long userId, String recipientScreenName, } mFinishedCallbackMap.put(mFetchMessagesCallbackHandle, callback); - new FetchStatusesTask().execute(AsyncTaskEx.PRIORITY_MEDIUM, + new FetchStatusesTask().execute(AsyncTaskEx.PRIORITY_HIGH, "Fetch DMs", new FetchDirectMessagesTaskInput( mFetchMessagesCallbackHandle, userId, recipientScreenName, statusText, connectionStatus)); diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/fetch/TwitterFetchStatuses.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/fetch/TwitterFetchStatuses.java index d363a0fa..0655a173 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/fetch/TwitterFetchStatuses.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/fetch/TwitterFetchStatuses.java @@ -237,7 +237,7 @@ public void trigger(TwitterContentHandle contentHandle, TwitterPaging paging, } mFinishedCallbackMap.put(mFetchStatusesCallbackHandle, callback); - new FetchStatusesTask().execute(AsyncTaskEx.PRIORITY_HIGH + priorityOffset, "Fetch Statuses", + new FetchStatusesTask().execute(AsyncTaskEx.PRIORITY_NOT_QUITE_HIGHEST + priorityOffset, "Fetch Statuses", new FetchStatusesTaskInput(mFetchStatusesCallbackHandle, contentHandle, paging, connectionStatus)); mFetchStatusesCallbackHandle += 1; diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index 41cadf45..ed89882c 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -268,6 +268,10 @@ public void finished(TwitterFetchResult fetchResult, TwitterStatuses feed, fetchNewestTweets(sinceStatusId, feed.getNewStatusesMaxId()); } } + else + { + onRefreshFinished(fetchResult, null); + } } }; @@ -457,8 +461,30 @@ boolean configureCachedStatuses() { * com.tweetlanes.android.core.view.BaseLaneFragment#triggerInitialDownload() */ public void triggerInitialDownload() { - fetchNewestTweets(); + mTweetDataRefreshCallback = new TwitterFetchStatusesFinishedCallback() { + + @Override + public void finished(TwitterFetchResult fetchResult, TwitterStatuses feed, TwitterContentHandle handle) { + if (!handle.getCurrentAccountKey().equals(getApp().getCurrentAccountKey())) { + Log.e("Statuses", "account changed, don't display statuses"); + return; + } + + + if (feed != null) { + setStatusFeed(feed, true); + } + updateViewVisibility(true); + setInitialDownloadState(InitialDownloadState.DOWNLOADED); + mTweetDataRefreshCallback = null; + } + }; + + Log.d("api-call", "--triggerInitialDownload((" + mContentHandle.getStatusesType().toString() + ")"); + TwitterManager.get() + .triggerFetchStatuses(mContentHandle, null, mTweetDataRefreshCallback, getAsyncTaskPriorityOffset()); setInitialDownloadState(InitialDownloadState.DOWNLOADING); + mTweetFeedListView.setRefreshing(); } /* From 9921aa940ff57330cb3654327a4ab872a01b962d Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Fri, 16 Aug 2013 14:38:46 +0100 Subject: [PATCH 050/163] Inlcude the set download complete --- .../src/com/tweetlanes/android/core/view/TweetFeedFragment.java | 1 + 1 file changed, 1 insertion(+) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index ed89882c..ace440ce 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -477,6 +477,7 @@ public void finished(TwitterFetchResult fetchResult, TwitterStatuses feed, Twitt updateViewVisibility(true); setInitialDownloadState(InitialDownloadState.DOWNLOADED); mTweetDataRefreshCallback = null; + mTweetFeedListView.onRefreshComplete(); } }; From ef2cede1a77f183de4f8642b691ed6754ef982f4 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Fri, 16 Aug 2013 17:02:13 +0100 Subject: [PATCH 051/163] partial revert of change to fix #232 Having realised this broke a previous change. Have gone about it a different way, and manually removed "http://", "https://" and "www." from the links. This means they are still full, but a little cleaner and nicer. --- .../SocialNetLib/src/com/twitter/Autolink.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/android/libraries/SocialNetLib/src/com/twitter/Autolink.java b/android/libraries/SocialNetLib/src/com/twitter/Autolink.java index 76ff274d..dd9e81ef 100644 --- a/android/libraries/SocialNetLib/src/com/twitter/Autolink.java +++ b/android/libraries/SocialNetLib/src/com/twitter/Autolink.java @@ -1,5 +1,7 @@ package com.twitter; +import android.text.TextUtils; + import com.twitter.Extractor.Entity; import org.tweetalib.android.model.TwitterMediaEntity; @@ -166,16 +168,20 @@ void linkToMentionAndList(Entity entity, String text, void linkToURL(Entity entity, String text, StringBuilder builder, URLEntity urlEntity) { CharSequence url = entity.getValue(); - CharSequence linkText = escapeHTML(url); + String linkText = escapeHTML(url).toString(); - if (urlEntity != null && urlEntity.getDisplayURL() != null) { - linkText = urlEntity.getDisplayURL(); - } else if (urlEntity != null && urlEntity.getExpandedURL() != null) { + if (urlEntity != null && urlEntity.getExpandedURL() != null) { linkText = urlEntity.getExpandedURL(); + } else if (urlEntity != null && urlEntity.getDisplayURL() != null) { + linkText = urlEntity.getDisplayURL(); } else if (entity.displayURL != null) { linkText = entity.displayURL; } + //Remove "http://" or "https://" + //Then remove "www." + linkText = linkText.replaceAll("^https?://", "").replaceAll("^www.", ""); + Map attrs = new LinkedHashMap(); attrs.put("href", url.toString()); From f122c0f322b786ffcd6d18fe1455d80110ce4725 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Sat, 17 Aug 2013 10:51:26 +0100 Subject: [PATCH 052/163] Ensure that the loading part if show whenever the fetch newest tweets is called. --- .../com/tweetlanes/android/core/view/TweetFeedFragment.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index ace440ce..a487164f 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -235,6 +235,7 @@ void fetchNewestTweets() { */ void fetchNewestTweets(final long sinceStatusId, Long maxStatusId) { + mTweetFeedListView.setRefreshing(); if (mTweetDataRefreshCallback == null) { @@ -284,11 +285,6 @@ public void finished(TwitterFetchResult fetchResult, TwitterStatuses feed, getBaseLaneActivity().finishCurrentActionMode(); } } - else - { - mTweetFeedListView.setRefreshing(); - } - } /* From 02b0659ff744c3a0cfdbb626c951c19ad41b2896 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Sat, 17 Aug 2013 10:58:57 +0100 Subject: [PATCH 053/163] for @jamesduffy different messages when the post is actually empty. --- android/libraries/TweetLanesCore/res/values/strings.xml | 3 +++ .../android/core/view/ComposeDirectMessageFragment.java | 2 ++ .../tweetlanes/android/core/view/ComposeTweetFragment.java | 6 +++++- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/android/libraries/TweetLanesCore/res/values/strings.xml b/android/libraries/TweetLanesCore/res/values/strings.xml index 0e6541b8..aaab9331 100644 --- a/android/libraries/TweetLanesCore/res/values/strings.xml +++ b/android/libraries/TweetLanesCore/res/values/strings.xml @@ -200,12 +200,15 @@ Your status update cannot be posted as it contains invalid characters. + Twitter doesn't know how to read silence. + App.net doesn't know how to read silence. Please enter the Twitter username of the person to message. The text of your Direct Message is too long and cannot be posted.\n\nYou message can be a maximum 140 characters in length. + Got nothin' to say do ya? Your Direct Message cannot be posted as it contains invalid characters. diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ComposeDirectMessageFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ComposeDirectMessageFragment.java index 9d5ddd2c..d93056da 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ComposeDirectMessageFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ComposeDirectMessageFragment.java @@ -212,6 +212,8 @@ protected void onSendClick(String status) { int statusLength = mStatusValidator.getTweetLength(status); if (otherUserScreenName == null) { showSimpleAlert(R.string.alert_direct_message_no_recipient); + } else if(statusLength==0){ + showSimpleAlert(R.string.alert_direct_message_empty); } else if (!mStatusValidator.isValidTweet(status)) { showSimpleAlert(mStatusValidator.getTweetLength(status) <= getMaxPostLength() ? R.string.alert_direct_message_invalid : R.string.alert_direct_message_too_long); diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ComposeTweetFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ComposeTweetFragment.java index 6d4aa0a8..92344475 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ComposeTweetFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ComposeTweetFragment.java @@ -278,7 +278,11 @@ void clearCompose(boolean saveCurrentTweet) { protected void onSendClick(String status) { if (status != null) { int statusLength = mStatusValidator.getTweetLength(status); - if (!mStatusValidator.isValidTweet(status, getMaxPostLength())) { + if (statusLength == 0){ + showSimpleAlert(getApp().getCurrentAccount().getSocialNetType() == SocialNetConstant.Type.Twitter ? R + .string.alert_status_empty : R.string.alert_status_empty_adn); + } + else if (!mStatusValidator.isValidTweet(status, getMaxPostLength())) { showSimpleAlert(mStatusValidator.getTweetLength(status) <= getMaxPostLength() ? R.string.alert_status_invalid : (getApp().getCurrentAccount().getSocialNetType() == SocialNetConstant.Type.Twitter ? R .string.alert_status_too_long : R.string.alert_status_too_long_adn)); From 0de980b285b65303aac53d45e940fd43bb0bb3ed Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Sat, 17 Aug 2013 11:06:04 +0100 Subject: [PATCH 054/163] Correct error in strings with an apostrophe --- android/libraries/TweetLanesCore/res/values/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/android/libraries/TweetLanesCore/res/values/strings.xml b/android/libraries/TweetLanesCore/res/values/strings.xml index aaab9331..9f9e41ef 100644 --- a/android/libraries/TweetLanesCore/res/values/strings.xml +++ b/android/libraries/TweetLanesCore/res/values/strings.xml @@ -200,15 +200,15 @@ Your status update cannot be posted as it contains invalid characters. - Twitter doesn't know how to read silence. - App.net doesn't know how to read silence. + Twitter doesn't know how to read silence. + App.net doesn't know how to read silence. Please enter the Twitter username of the person to message. The text of your Direct Message is too long and cannot be posted.\n\nYou message can be a maximum 140 characters in length. - Got nothin' to say do ya? + Got nothin' to say do ya? Your Direct Message cannot be posted as it contains invalid characters. From 6f32b8ba1577e1478687c4065ef4ff4f3df900e5 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Sat, 17 Aug 2013 11:07:17 +0100 Subject: [PATCH 055/163] Correct error in strings with an apostrophe attempt 2 --- android/libraries/TweetLanesCore/res/values/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/android/libraries/TweetLanesCore/res/values/strings.xml b/android/libraries/TweetLanesCore/res/values/strings.xml index 9f9e41ef..5f1e0080 100644 --- a/android/libraries/TweetLanesCore/res/values/strings.xml +++ b/android/libraries/TweetLanesCore/res/values/strings.xml @@ -200,15 +200,15 @@ Your status update cannot be posted as it contains invalid characters. - Twitter doesn't know how to read silence. - App.net doesn't know how to read silence. + Twitter doesn\'t know how to read silence. + App.net doesn\'t know how to read silence. Please enter the Twitter username of the person to message. The text of your Direct Message is too long and cannot be posted.\n\nYou message can be a maximum 140 characters in length. - Got nothin' to say do ya? + Got nothin\' to say do ya? Your Direct Message cannot be posted as it contains invalid characters. From e7549eb2538930f3502d1a72d885f3f38f4da922 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Sat, 17 Aug 2013 11:26:10 +0100 Subject: [PATCH 056/163] fix for #236 - new tweet bar reshow on screen orientation change --- .../android/core/view/TweetFeedFragment.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index a487164f..27c19cb4 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -172,9 +172,10 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa if(savedInstanceState != null) { - mTwitterStatusIdWhenRefreshed = savedInstanceState.getLong("TwitterStatusIdWhenRefreshed"); - mLastTwitterStatusIdSeen = savedInstanceState.getLong("LastTwitterStatusIdSeen"); + mTwitterStatusIdWhenRefreshed = savedInstanceState.containsKey("TwitterStatusIdWhenRefreshed") ? savedInstanceState.getLong("TwitterStatusIdWhenRefreshed") : null; + mLastTwitterStatusIdSeen = savedInstanceState.containsKey("LastTwitterStatusIdSeen") ? savedInstanceState.getLong("LastTwitterStatusIdSeen") : null; mNewStatuses = savedInstanceState.getInt("NewStatuses",0); + mHidingListHeading = savedInstanceState.getBoolean("HidingListHeading", false); } return resultView; @@ -184,9 +185,12 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa public void onSaveInstanceState(Bundle state) { super.onSaveInstanceState(state); + if (mTwitterStatusIdWhenRefreshed != null) state.putLong("TwitterStatusIdWhenRefreshed", mTwitterStatusIdWhenRefreshed); if (mLastTwitterStatusIdSeen != null) state.putLong("LastTwitterStatusIdSeen", mLastTwitterStatusIdSeen); state.putInt("NewStatuses", mNewStatuses); + state.putBoolean("HidingListHeading", mHidingListHeading); + } /* @@ -735,7 +739,7 @@ void updateListHeading(int firstVisibleItem) { SocialNetConstant.Type socialNetType = getApp().getCurrentAccount().getSocialNetType(); - if (mTwitterStatusIdWhenRefreshed != null && firstVisibleItem > 0) { + if (mTwitterStatusIdWhenRefreshed != null && mTwitterStatusIdWhenRefreshed > 0 && firstVisibleItem > 0) { if (!mHidingListHeading) { TwitterStatus status = getStatusFeed().getStatus(firstVisibleItem); if((mNewStatuses == 0 || status.mId >= mTwitterStatusIdWhenRefreshed) && status.mId >= mLastTwitterStatusIdSeen) From 64333ad7cc76f5b2800320e0f901e22d835894cb Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Sat, 17 Aug 2013 11:36:47 +0100 Subject: [PATCH 057/163] Added an extra extra large font for #206 with a size of 22sp Also added a super size...at 24sp. One of these should be large enough...i hope. --- android/libraries/TweetLanesCore/res/values/arrays.xml | 2 ++ android/libraries/TweetLanesCore/res/values/dimens.xml | 2 ++ .../libraries/TweetLanesCore/res/xml/preferences.xml | 7 ------- .../src/com/tweetlanes/android/core/AppSettings.java | 10 ++++++++-- .../android/core/view/DirectMessageItemView.java | 6 ++++++ .../android/core/view/TweetFeedItemView.java | 6 ++++++ 6 files changed, 24 insertions(+), 9 deletions(-) diff --git a/android/libraries/TweetLanesCore/res/values/arrays.xml b/android/libraries/TweetLanesCore/res/values/arrays.xml index e8f177dd..0ee03bc0 100644 --- a/android/libraries/TweetLanesCore/res/values/arrays.xml +++ b/android/libraries/TweetLanesCore/res/values/arrays.xml @@ -8,6 +8,8 @@ Medium Large Extra Large + Extra Extra Large + Supersize diff --git a/android/libraries/TweetLanesCore/res/values/dimens.xml b/android/libraries/TweetLanesCore/res/values/dimens.xml index 8571d911..498d05b5 100644 --- a/android/libraries/TweetLanesCore/res/values/dimens.xml +++ b/android/libraries/TweetLanesCore/res/values/dimens.xml @@ -35,6 +35,8 @@ All Rights Reserved. --> 16sp 18sp 20sp + 22sp + 24sp 80dp 80dp diff --git a/android/libraries/TweetLanesCore/res/xml/preferences.xml b/android/libraries/TweetLanesCore/res/xml/preferences.xml index cfbd4c91..b15048a7 100644 --- a/android/libraries/TweetLanesCore/res/xml/preferences.xml +++ b/android/libraries/TweetLanesCore/res/xml/preferences.xml @@ -111,13 +111,6 @@ android:title="@string/title_downloadimages_preference" android:summary="@string/summary_downloadimages_preference"/> - diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/AppSettings.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/AppSettings.java index 68b9c344..94c99fb4 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/AppSettings.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/AppSettings.java @@ -31,6 +31,8 @@ public class AppSettings { private static final String STATUS_SIZE_MEDIUM = "Medium"; private static final String STATUS_SIZE_LARGE = "Large"; private static final String STATUS_SIZE_EXTRA_LARGE = "Extra Large"; + private static final String STATUS_SIZE_EXTRA_EXTRA_LARGE = "Extra Extra Large"; + private static final String STATUS_SIZE_SUPERSIZE = "Supersize"; private static final String STATUS_SIZE_DEFAULT = STATUS_SIZE_MEDIUM; private static final String PROFILE_IMAGE_SIZE_SMALL = "Small"; @@ -71,7 +73,7 @@ public enum Theme { * */ public enum StatusSize { - ExtraSmall, Small, Medium, Large, ExtraLarge, + ExtraSmall, Small, Medium, Large, ExtraLarge, ExtraExtraLarge, Supersize } /* @@ -315,7 +317,11 @@ void setCurrentStatusSize(String statusSize) { mStatusSize = StatusSize.Large; } else if (statusSize.equals(STATUS_SIZE_EXTRA_LARGE)) { mStatusSize = StatusSize.ExtraLarge; - } else { + } else if (statusSize.equals(STATUS_SIZE_EXTRA_EXTRA_LARGE)) { + mStatusSize = StatusSize.ExtraExtraLarge; + } else if (statusSize.equals(STATUS_SIZE_SUPERSIZE)) { + mStatusSize = StatusSize.Supersize; + }else { mStatusSize = StatusSize.Medium; } diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/DirectMessageItemView.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/DirectMessageItemView.java index d4fbd120..9a9e3e2b 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/DirectMessageItemView.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/DirectMessageItemView.java @@ -153,6 +153,12 @@ public void configure(String userScreenName, case ExtraLarge: textSize = R.dimen.font_size_extra_large; break; + case ExtraExtraLarge: + textSize = R.dimen.font_size_extra_extra_large; + break; + case Supersize: + textSize = R.dimen.font_size_supersize; + break; } if (textSize != null) { diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedItemView.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedItemView.java index c6c5f413..8f66cd38 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedItemView.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedItemView.java @@ -225,6 +225,12 @@ public void onClick(View v) { case ExtraLarge: textSize = R.dimen.font_size_extra_large; break; + case ExtraExtraLarge: + textSize = R.dimen.font_size_extra_extra_large; + break; + case Supersize: + textSize = R.dimen.font_size_supersize; + break; } if (textSize != null && resize) { From bd87fb4e88fde490ae5a65abfc00f547230b14f1 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Sat, 17 Aug 2013 12:50:43 +0100 Subject: [PATCH 058/163] fix for #209 Profile image and service icon only show when you have 3 or more accounts on the same network. Or accounts on both ADN and Twitter --- .../TweetLanesCore/res/layout/account_row.xml | 2 +- .../TweetLanesCore/res/values/dimens.xml | 3 +- .../android/core/view/HomeActivity.java | 34 +++++++++++++++++-- 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/android/libraries/TweetLanesCore/res/layout/account_row.xml b/android/libraries/TweetLanesCore/res/layout/account_row.xml index 35d9b3f7..afa79914 100644 --- a/android/libraries/TweetLanesCore/res/layout/account_row.xml +++ b/android/libraries/TweetLanesCore/res/layout/account_row.xml @@ -33,7 +33,7 @@ 80dp 0dp - 0dp16sp + 0dp + 16sp diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java index 23f642b0..534fa95e 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java @@ -738,18 +738,40 @@ class AccountAdapter extends android.widget.BaseAdapter { final Context mContext; final List mData; + boolean mShowImages; public AccountAdapter(Context context, List data) { mContext = context; mData = new ArrayList(); + + mShowImages = data != null && data.size() >= 3; + + boolean seenAdn = false; + boolean seenTwitter = false; + if (data != null) { + for (AccountDescriptor account : data) { + SocialNetConstant.Type networkType = account.getSocialNetType(); mData.add(new AccountData(account.getId(), "@" + account.getScreenName(), - account.getSocialNetType(), account.getProfileImageUrl())); + networkType, account.getProfileImageUrl())); + + if(networkType== SocialNetConstant.Type.Appdotnet){ + seenAdn = true; + } + else + { + seenTwitter=true; + } } } + if(seenAdn && seenTwitter) + { + mShowImages = true; + } + mData.add(new AccountData(0, getString(R.string.add_account), null, null)); } @@ -802,7 +824,15 @@ public View getView(int position, View convertView, ViewGroup parent) { holder.ScreenName.setTextColor(getResources().getColor(R.color.white)); } - setProfileImage(account.AvatarImageUrl, account.ServiceType, holder.AvatarImage, holder.ServiceImage); + if (mShowImages) + { + setProfileImage(account.AvatarImageUrl, account.ServiceType, holder.AvatarImage, holder.ServiceImage); + } + else + { + holder.AvatarImage.setVisibility(View.GONE); + holder.ServiceImage.setVisibility(View.GONE); + } return row; } From 698a7b02406e6dabbe51a17ba7370b630549d5aa Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Sat, 17 Aug 2013 13:08:00 +0100 Subject: [PATCH 059/163] Fix for #191 change autocomplete mention search to search anywhere in the username. Also added the persons actual name meaning it's easier to find users on the auto complete --- .../tweetlanes/android/core/view/ComposeBaseFragment.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ComposeBaseFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ComposeBaseFragment.java index 83541f44..abcfc946 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ComposeBaseFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ComposeBaseFragment.java @@ -552,8 +552,13 @@ private ArrayList getAutoCompleteMentions(String text) { ArrayList list = new ArrayList(); List users = TwitterManager.get().getFetchUserInstance().getCachedUsers(); + text = text.replace("@", ""); + for (TwitterUser user : users) { - if (("@" + user.getScreenName()).toLowerCase().startsWith(text.toLowerCase())) { + + if (user.getScreenName().toLowerCase().contains(text.toLowerCase()) || + user.getName().toLowerCase().contains(text.toLowerCase())) + { list.add(user); } } From 4e2b4a147d513fd112335c2b0ff2d2d116aa28c5 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Sat, 17 Aug 2013 13:12:49 +0100 Subject: [PATCH 060/163] Updated change log with this mornings changes --- android/libraries/TweetLanesCore/res/xml/changelog.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/android/libraries/TweetLanesCore/res/xml/changelog.xml b/android/libraries/TweetLanesCore/res/xml/changelog.xml index 71a87e14..50bb84e7 100644 --- a/android/libraries/TweetLanesCore/res/xml/changelog.xml +++ b/android/libraries/TweetLanesCore/res/xml/changelog.xml @@ -3,12 +3,17 @@ Feature - Added a visual cue when favorite button is pressed Feature - Added Holo Light Dark Actionbar Theme + Feature - Added "Extra Extra Large" and "Supersize" font sizes + Feature - Extended the auto complete to match typed text anywhere in username and in full name Fix - Links are now shown in full, rather than a "display link" Fix - Links in profile descriptions converted from t.co links Fix - Reply when loading profile correction. Show "Tweet @username" Fix - Correct issues around compose box after loading profile Fix - Use the t.co display url, rather than expanded url. These are formatted nicer Fix - Fix issue when more than 1 page of tweets. Fetch only completes when all tweets collected preventing feed jumping + Fix - Change the message when you try and send an empty status update + Fix - Correct issue with the new tweet bar when orientation changes and account switches + Fix - Profile and service icon only show when you use both networks, or have 3 or more accounts Other - Large codebase tidy-up - hopefully small improvement to performance, size and reliability @@ -66,3 +71,4 @@ Other - Removed open source code from Twidere, as it was license incompatible with Tweet Lanes + From 131898e00faaf3a738a8d22ac630bf0c11a7bec8 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Sat, 17 Aug 2013 13:17:50 +0100 Subject: [PATCH 061/163] Run a reformat on tweetlanes core. Correct spacing etc --- .../src/com/tweetlanes/android/core/App.java | 2 +- .../tweetlanes/android/core/AppSettings.java | 25 +-- .../com/tweetlanes/android/core/Constant.java | 2 +- .../com/tweetlanes/android/core/Notifier.java | 18 +- .../core/dashclock/TweetLanesExtension.java | 6 +- .../android/core/model/AccountDescriptor.java | 7 +- .../core/model/ComposeTweetDefault.java | 15 +- .../android/core/model/LaneDescriptor.java | 6 +- .../android/core/urlservice/ApiService.java | 10 +- .../tweetmarker/TweetMarkerAPI.java | 16 +- .../android/core/util/LazyImageLoader.java | 63 +++--- .../tweetlanes/android/core/util/Util.java | 22 +- .../android/core/view/AlarmReceiver.java | 10 +- .../android/core/view/BaseLaneActivity.java | 42 ++-- .../android/core/view/BaseLaneFragment.java | 2 +- .../android/core/view/BootActivity.java | 6 +- .../core/view/ComposeBaseFragment.java | 113 ++++------ .../view/ComposeDirectMessageFragment.java | 12 +- .../android/core/view/ConversationView.java | 23 +- .../android/core/view/DeviceBootReciever.java | 1 + .../core/view/DirectMessageActivity.java | 6 +- .../core/view/DirectMessageFeedFragment.java | 2 +- .../core/view/DirectMessageItemView.java | 18 +- .../android/core/view/HomeActivity.java | 65 +++--- .../android/core/view/ImageViewActivity.java | 2 +- .../core/view/InflatedLayoutFragment.java | 2 +- .../android/core/view/ProfileActivity.java | 19 +- .../android/core/view/ProfileFragment.java | 30 +-- .../android/core/view/SettingsActivity.java | 2 +- .../android/core/view/TutorialActivity.java | 2 +- .../android/core/view/TweetFeedFragment.java | 206 ++++++++---------- .../android/core/view/TweetFeedItemView.java | 26 +-- .../core/view/TweetSpotlightActivity.java | 76 +++---- .../core/view/TweetSpotlightFragment.java | 54 ++--- .../core/view/TwitterAuthActivity.java | 2 +- .../android/core/view/UserFeedFragment.java | 4 +- .../android/core/view/UserFeedItemView.java | 9 +- .../android/core/widget/EditClearText.java | 2 +- .../gestureimageview/GestureImageView.java | 8 +- .../ContactContentUrlDownloader.java | 4 +- .../ContentUrlDownloader.java | 4 +- .../urlimageviewhelper/FileUrlDownloader.java | 6 +- .../urlimageviewhelper/HttpUrlDownloader.java | 14 +- .../urlimageviewhelper/UrlDownloader.java | 4 +- .../UrlImageViewHelper.java | 32 +-- .../ListTabPageIndicator.java | 4 +- 46 files changed, 427 insertions(+), 577 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/App.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/App.java index 78c29410..86f7804b 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/App.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/App.java @@ -262,7 +262,7 @@ public void clearTweetDraft() { } /* - * + * */ public String getTweetDraftAsString() { diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/AppSettings.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/AppSettings.java index 94c99fb4..e5fa656f 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/AppSettings.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/AppSettings.java @@ -70,7 +70,7 @@ public enum Theme { } /* - * + * */ public enum StatusSize { ExtraSmall, Small, Medium, Large, ExtraLarge, ExtraExtraLarge, Supersize @@ -136,12 +136,11 @@ public void refresh(String preferenceKey) { String theme = mSharedPreferences.getString( SettingsActivity.KEY_THEME_PREFERENCE, THEME_DEFAULT); - if(theme.equals(THEME_LIGHT)){ + if (theme.equals(THEME_LIGHT)) { setCurrentTheme(Theme.Holo_Light); - } - else if(theme.equals(THEME_DARK)){ + } else if (theme.equals(THEME_DARK)) { setCurrentTheme(Theme.Holo_Dark); - }else{ + } else { setCurrentTheme(Theme.Holo_Light_DarkAction); } @@ -271,13 +270,13 @@ public boolean showTabletMargin() { * */ public int getCurrentThemeStyle() { - if(mCurrentTheme == Theme.Holo_Dark){ - return R.style.Theme_TweetLanes; - }else if(mCurrentTheme == Theme.Holo_Light){ - return R.style.Theme_TweetLanes_Light; - }else{ - return R.style.Theme_TweetLanes_Light_DarkActionBar; - } + if (mCurrentTheme == Theme.Holo_Dark) { + return R.style.Theme_TweetLanes; + } else if (mCurrentTheme == Theme.Holo_Light) { + return R.style.Theme_TweetLanes_Light; + } else { + return R.style.Theme_TweetLanes_Light_DarkActionBar; + } } @@ -321,7 +320,7 @@ void setCurrentStatusSize(String statusSize) { mStatusSize = StatusSize.ExtraExtraLarge; } else if (statusSize.equals(STATUS_SIZE_SUPERSIZE)) { mStatusSize = StatusSize.Supersize; - }else { + } else { mStatusSize = StatusSize.Medium; } diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/Constant.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/Constant.java index 05c3c53a..42ef1bb0 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/Constant.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/Constant.java @@ -54,7 +54,7 @@ public enum LaneType { } /* - * + * */ public enum SystemEvent { VOLUME_UP_KEY_DOWN, VOLUME_DOWN_KEY_DOWN, FORCE_FRAGMENT_PAGER_ADAPTER_REFRESH, RESTART_APP, DISPLAY_TOAST, diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/Notifier.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/Notifier.java index fadffe03..c6a7c85a 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/Notifier.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/Notifier.java @@ -4,12 +4,12 @@ import android.app.AlarmManager; import android.app.NotificationManager; import android.app.PendingIntent; -import android.support.v4.app.NotificationCompat; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; import android.preference.PreferenceManager; +import android.support.v4.app.NotificationCompat; import android.support.v4.app.TaskStackBuilder; import com.tweetlanes.android.core.view.AlarmReceiver; @@ -32,7 +32,7 @@ public static void notify(String title, String text, String bigText, Boolean aut .setStyle(new NotificationCompat.BigTextStyle().bigText(bigText)); if (AppSettings.get().isNotificationVibrationEnabled()) { - long[] pattern = {200,500,200}; + long[] pattern = {200, 500, 200}; builder.setVibrate(pattern); } @@ -88,10 +88,8 @@ public static void cancel(Context context, String accountKey, String type) { public static void setNotificationAlarm(Context context) { if (AppSettings.get().isShowNotificationsEnabled()) { long mNewNotificationTime = AppSettings.get().getNotificationTime(); - if (mNotificationTime != mNewNotificationTime) - { - if (mNotificationTime > 0) - { + if (mNotificationTime != mNewNotificationTime) { + if (mNotificationTime > 0) { cancelNotificationAlarm(context); } mNotificationTime = mNewNotificationTime; @@ -127,8 +125,7 @@ public static void saveLastNotificationActioned(Context context, String accountK String pref = type.equals(SharedPreferencesConstants.NOTIFICATION_TYPE_MENTION) ? SharedPreferencesConstants.NOTIFICATION_LAST_ACTIONED_MENTION_ID : SharedPreferencesConstants.NOTIFICATION_LAST_ACTIONED_DIRECT_MESSAGE_ID; long lastDisplayedMentionId = preferences.getLong(pref + accountKey, 0); - if (postId > lastDisplayedMentionId) - { + if (postId > lastDisplayedMentionId) { SharedPreferences.Editor edit = preferences.edit(); edit.putLong(pref + accountKey, postId); edit.commit(); @@ -144,15 +141,14 @@ private static void saveLastNotificationDisplayed(Context context, String accoun String pref = type.equals(SharedPreferencesConstants.NOTIFICATION_TYPE_MENTION) ? SharedPreferencesConstants.NOTIFICATION_LAST_DISPLAYED_MENTION_ID : SharedPreferencesConstants.NOTIFICATION_LAST_DISPLAYED_DIRECT_MESSAGE_ID; long lastDisplayedMentionId = preferences.getLong(pref + accountKey, 0); - if (postId > lastDisplayedMentionId) - { + if (postId > lastDisplayedMentionId) { SharedPreferences.Editor edit = preferences.edit(); edit.putLong(pref + accountKey, postId); edit.commit(); } } - public static void setDashclockValues(Context context, String accountKey, String type, int count, String detail) { + public static void setDashclockValues(Context context, String accountKey, String type, int count, String detail) { SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences.Editor edit = preferences.edit(); edit.putInt(SharedPreferencesConstants.NOTIFICATION_COUNT + accountKey + type, count); diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/dashclock/TweetLanesExtension.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/dashclock/TweetLanesExtension.java index f85f98d1..d0689171 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/dashclock/TweetLanesExtension.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/dashclock/TweetLanesExtension.java @@ -59,8 +59,7 @@ protected void onUpdateData(int arg0) { String title = mentionCount > 0 ? mentionCount + " new mentions" : ""; if (title.length() == 0) { title = dmCount + " new direct messages"; - } - else if (dmCount > 0) { + } else if (dmCount > 0) { title += ", " + dmCount + " new direct mentions"; } publishUpdate(new ExtensionData().visible(true).icon(R.drawable.ic_launcher).status(String.valueOf(mentionCount + dmCount)) @@ -76,8 +75,7 @@ private Intent getHomeIntent(String accountKey, String type) { if (type.equals(SharedPreferencesConstants.NOTIFICATION_TYPE_MENTION)) { postId = preferences.getLong(SharedPreferencesConstants.NOTIFICATION_LAST_DISPLAYED_MENTION_ID + accountKey, 0); - } - else { + } else { postId = preferences.getLong(SharedPreferencesConstants.NOTIFICATION_LAST_DISPLAYED_DIRECT_MESSAGE_ID + accountKey, 0); } diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/model/AccountDescriptor.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/model/AccountDescriptor.java index ba34b419..6373b20b 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/model/AccountDescriptor.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/model/AccountDescriptor.java @@ -61,7 +61,7 @@ public AccountDescriptor(Context context, TwitterUser user, String oAuthToken, } /* - * + * */ public AccountDescriptor(Context context, String jsonAsString) { @@ -352,11 +352,11 @@ public String getOAuthSecret() { return mOAuthSecret; } - public String getProfileImageUrl(){ + public String getProfileImageUrl() { return mProfileImageUrl; } - public void setProfileImageUrl(String profileImageUrl){ + public void setProfileImageUrl(String profileImageUrl) { mProfileImageUrl = profileImageUrl; } @@ -484,6 +484,7 @@ public boolean shouldRefreshLists() { private final Context mContext; private SocialNetConstant.Type mSocialNetType; private String mProfileImageUrl; + /* * Stripped version of the List class. Possibly should use TwitterList, but * I thought I thought it best to save the string space of that much larger diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/model/ComposeTweetDefault.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/model/ComposeTweetDefault.java index 9a7e4163..86fca57f 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/model/ComposeTweetDefault.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/model/ComposeTweetDefault.java @@ -11,15 +11,15 @@ package com.tweetlanes.android.core.model; -import java.util.HashSet; -import java.util.Set; - import org.json.JSONException; import org.json.JSONObject; import org.tweetalib.android.model.TwitterStatus; import org.tweetalib.android.model.TwitterStatuses; import org.tweetalib.android.model.TwitterUsers; +import java.util.HashSet; +import java.util.Set; + public class ComposeTweetDefault { private String mUserScreenName; @@ -59,7 +59,7 @@ public String toString() { } /* - * + * */ public ComposeTweetDefault(String jsonAsString) { @@ -92,12 +92,9 @@ public ComposeTweetDefault(String userScreenName, String defaultStatus, mStatus = defaultStatus; mInitialStatus = defaultStatus; mInitialStatusIsPlaceholder = false; - if(defaultStatus == "") - { + if (defaultStatus == "") { mInReplyToStatusId = null; - } - else - { + } else { mInReplyToStatusId = inReplyToStatusId; } mMediaFilePath = mediaFilePath; diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/model/LaneDescriptor.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/model/LaneDescriptor.java index e1d459b4..8c57dea4 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/model/LaneDescriptor.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/model/LaneDescriptor.java @@ -11,10 +11,10 @@ package com.tweetlanes.android.core.model; -import org.tweetalib.android.TwitterContentHandleBase; - import com.tweetlanes.android.core.Constant; +import org.tweetalib.android.TwitterContentHandleBase; + public class LaneDescriptor { private static final String kDefaultId = null; @@ -29,7 +29,7 @@ public LaneDescriptor(Constant.LaneType laneType, String laneTitle, } /* - * + * */ public LaneDescriptor(Constant.LaneType laneType, String laneTitle, String identifier, TwitterContentHandleBase contentHandleBase) { diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/urlservice/ApiService.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/urlservice/ApiService.java index 5788c0df..4a92cc77 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/urlservice/ApiService.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/urlservice/ApiService.java @@ -11,10 +11,6 @@ package com.tweetlanes.android.core.urlservice; -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; - import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; @@ -22,6 +18,10 @@ import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; + public abstract class ApiService { // NOTE: Look at this: @@ -54,7 +54,7 @@ public static HttpResponse getRequest(String url, String debugName) { } /* - * + * */ public static HttpResponse postRequest(String url, String debugName) { HttpClient client = new DefaultHttpClient(); diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/urlservice/tweetmarker/TweetMarkerAPI.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/urlservice/tweetmarker/TweetMarkerAPI.java index 62c103d1..a9695790 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/urlservice/tweetmarker/TweetMarkerAPI.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/urlservice/tweetmarker/TweetMarkerAPI.java @@ -11,9 +11,10 @@ package com.tweetlanes.android.core.urlservice.tweetmarker; -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; +import android.net.Uri; + +import com.tweetlanes.android.core.model.AccountDescriptor; +import com.tweetlanes.android.core.urlservice.ApiService; import org.apache.http.HttpResponse; import org.apache.http.ParseException; @@ -28,10 +29,9 @@ import org.tweetalib.android.TwitterFetchResult; import org.tweetalib.android.TwitterManager; -import android.net.Uri; - -import com.tweetlanes.android.core.model.AccountDescriptor; -import com.tweetlanes.android.core.urlservice.ApiService; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; class TweetMarkerAPI extends ApiService { @@ -75,7 +75,7 @@ public interface APICallback { } /* - * + * */ public static void getLastRead(AccountDescriptor account, final ConnectionStatus.Callbacks connectionStatus, diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/util/LazyImageLoader.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/util/LazyImageLoader.java index c98f73cd..1e025d78 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/util/LazyImageLoader.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/util/LazyImageLoader.java @@ -13,8 +13,15 @@ package com.tweetlanes.android.core.util; -import static android.os.Environment.getExternalStorageDirectory; -import static android.os.Environment.getExternalStorageState; +import android.app.Activity; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.os.Build; +import android.os.Environment; +import android.widget.GridView; +import android.widget.ImageView; +import android.widget.ListView; import java.io.File; import java.io.FileFilter; @@ -30,6 +37,7 @@ import java.net.URL; import java.util.Calendar; import java.util.Collections; +import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; @@ -39,17 +47,9 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.Date; -import android.app.Activity; -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.os.Build; -import android.os.Environment; -import android.widget.GridView; -import android.widget.ImageView; -import android.widget.ListView; +import static android.os.Environment.getExternalStorageDirectory; +import static android.os.Environment.getExternalStorageState; // import static org.mariotaku.twidere.util.Utils.getProxy; // import static com.tweetlanes.android.core.util.parseURL; // import static org.mariotaku.twidere.util.Utils.setIgnoreSSLError; @@ -233,8 +233,7 @@ public void saveFile(Bitmap image, URL tag) { if (filename == null) return; final File file = new File(mCacheDir, filename); FileOutputStream fOut; - try - { + try { fOut = new FileOutputStream(file); image.compress(Bitmap.CompressFormat.PNG, 100, fOut); fOut.flush(); @@ -244,7 +243,7 @@ public void saveFile(Bitmap image, URL tag) { } } - private void deleteFile(final URL tag){ + private void deleteFile(final URL tag) { if (mCacheDir == null) return; final File[] files = mCacheDir.listFiles(new FileFilter() { @Override @@ -258,13 +257,13 @@ public boolean accept(File file) { } } - public void clearUrls(Set urls){ - for(URL url : urls){ + public void clearUrls(Set urls) { + for (URL url : urls) { deleteFile(url); } } - public void clearUnrecognisedFiles(Set urls){ + public void clearUnrecognisedFiles(Set urls) { Calendar cal = Calendar.getInstance(); cal.add(Calendar.DATE, -1); @@ -272,17 +271,15 @@ public void clearUnrecognisedFiles(Set urls){ if (files == null) return; for (final File f : files) { Date lastModDate = new Date(f.lastModified()); - if(lastModDate.before(cal.getTime())) - { + if (lastModDate.before(cal.getTime())) { boolean fileInCache = false; - for(URL url : urls){ - if(f.getName() == getURLFilename(url)) - { + for (URL url : urls) { + if (f.getName() == getURLFilename(url)) { fileInCache = true; } } - if (!fileInCache){ + if (!fileInCache) { f.delete(); } } @@ -336,8 +333,7 @@ private Bitmap getBitmap(URL url) { } - private Bitmap DownloadBitmapFromWeb(URL url, File f, Boolean isRetry) - { + private Bitmap DownloadBitmapFromWeb(URL url, File f, Boolean isRetry) { try { Bitmap bitmap; final HttpURLConnection conn = (HttpURLConnection) url @@ -353,13 +349,10 @@ private Bitmap DownloadBitmapFromWeb(URL url, File f, Boolean isRetry) bitmap = decodeFile(f); int bitmapBytes = bitmap.getByteCount(); - if (bitmapBytes == 0){ - if (isRetry) - { + if (bitmapBytes == 0) { + if (isRetry) { return null; - } - else - { + } else { return DownloadBitmapFromWeb(url, f, true); } } @@ -447,7 +440,7 @@ public Set clear() { Calendar cal = Calendar.getInstance(); cal.add(Calendar.DATE, -1); Map copy = new HashMap(mHardCache); - for (URL url : copy.keySet()){ + for (URL url : copy.keySet()) { ExpiringBitmap bitmap = mHardCache.get(url); if (bitmap != null) { @@ -456,7 +449,7 @@ public Set clear() { } } } - for (URL url : clearedUrls){ + for (URL url : clearedUrls) { mHardCache.remove(url); mSoftCache.remove(url); } @@ -465,7 +458,7 @@ public Set clear() { return clearedUrls; } - public Set getActiveUrls(){ + public Set getActiveUrls() { return new HashSet(mHardCache.keySet()); } diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/util/Util.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/util/Util.java index 8ef502f9..a174c31f 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/util/Util.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/util/Util.java @@ -11,27 +11,23 @@ package com.tweetlanes.android.core.util; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.content.res.Resources; +import android.os.Environment; +import android.util.DisplayMetrics; + import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; import java.net.MalformedURLException; import java.net.Proxy; import java.net.URL; -import java.net.URLConnection; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.content.res.Resources; -import android.os.Environment; -import android.util.DisplayMetrics; - public final class Util { /* @@ -42,7 +38,7 @@ public static boolean isValidString(String s) { } /* - * + * */ public static String getFullDate(Date date) { SimpleDateFormat formatted = new SimpleDateFormat( diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/AlarmReceiver.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/AlarmReceiver.java index 78bededc..42da5f57 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/AlarmReceiver.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/AlarmReceiver.java @@ -77,12 +77,11 @@ public void finished(TwitterFetchResult result, TwitterStatuses feed, TwitterCon contentHandle.getCurrentAccountKey(), SharedPreferencesConstants.NOTIFICATION_TYPE_MENTION, first.mId, mContext); Notifier.setDashclockValues(mContext, contentHandle.getCurrentAccountKey(), SharedPreferencesConstants.NOTIFICATION_TYPE_MENTION, count, fullDetail); - } - else { - Notifier.setDashclockValues(mContext, contentHandle.getCurrentAccountKey(), SharedPreferencesConstants.NOTIFICATION_TYPE_MENTION, 0, ""); + } else { + Notifier.setDashclockValues(mContext, contentHandle.getCurrentAccountKey(), SharedPreferencesConstants.NOTIFICATION_TYPE_MENTION, 0, ""); } } else { - Notifier.setDashclockValues(mContext, contentHandle.getCurrentAccountKey(), SharedPreferencesConstants.NOTIFICATION_TYPE_MENTION, 0, ""); + Notifier.setDashclockValues(mContext, contentHandle.getCurrentAccountKey(), SharedPreferencesConstants.NOTIFICATION_TYPE_MENTION, 0, ""); } } }; @@ -134,8 +133,7 @@ public void finished(TwitterContentHandle contentHandle, TwitterFetchResult resu contentHandle.getCurrentAccountKey(), SharedPreferencesConstants.NOTIFICATION_TYPE_DIRECT_MESSAGE, first.getId(), mContext); Notifier.setDashclockValues(mContext, contentHandle.getCurrentAccountKey(), SharedPreferencesConstants.NOTIFICATION_TYPE_DIRECT_MESSAGE, count, fullDetail); - } - else { + } else { Notifier.setDashclockValues(mContext, contentHandle.getCurrentAccountKey(), SharedPreferencesConstants.NOTIFICATION_TYPE_DIRECT_MESSAGE, 0, ""); } } else { diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java index 446a2a5d..10194680 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java @@ -40,7 +40,6 @@ import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnFocusChangeListener; -import android.view.WindowManager; import android.widget.LinearLayout; import android.widget.SearchView; import android.widget.Toast; @@ -203,9 +202,8 @@ public void onCurrentItemClicked() { new IntentFilter("" + SystemEvent.RESTART_APP)); Intent intent = getIntent(); - if(intent.getAction() == Intent.ACTION_VIEW) - { - intent.putExtra("clearCompose","true"); + if (intent.getAction() == Intent.ACTION_VIEW) { + intent.putExtra("clearCompose", "true"); } } @@ -219,8 +217,7 @@ protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); Intent intent = getIntent(); - if(intent.getAction() != Intent.ACTION_SEND && intent.getAction() != Intent.ACTION_VIEW) - { + if (intent.getAction() != Intent.ACTION_SEND && intent.getAction() != Intent.ACTION_VIEW) { setComposeDefault(); } } @@ -289,7 +286,7 @@ protected void onPause() { } /* - * + * */ private final BroadcastReceiver mDisplayToastReceiver = new BroadcastReceiver() { @@ -338,8 +335,7 @@ void setCurrentComposeFragment(int type) { } } - void clearCompose() - { + void clearCompose() { mCurrentComposeFragment.clearCompose(false); } @@ -801,7 +797,7 @@ boolean composeReleaseFocus(boolean forceCleanup) { * directory */ private File getFixedTempFile(Context context) { - File path = new File(Environment.getExternalStorageDirectory(),"temp/images/Tweet Lanes"); + File path = new File(Environment.getExternalStorageDirectory(), "temp/images/Tweet Lanes"); path.mkdirs(); File tempFile; @@ -818,7 +814,7 @@ private File getFixedTempFile(Context context) { * directory */ private File getTempFile(Context context) { - File path = new File(Environment.getExternalStorageDirectory(),"temp/images/Tweet Lanes"); + File path = new File(Environment.getExternalStorageDirectory(), "temp/images/Tweet Lanes"); path.mkdirs(); File tempFile; @@ -1026,14 +1022,12 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { // Toast.makeText(this,R.string.picture_attached,Toast.LENGTH_SHORT).show(); } - } else if( requestCode == Constant.REQUEST_CODE_SPOTLIGHT ) { - if (data != null) - { + } else if (requestCode == Constant.REQUEST_CODE_SPOTLIGHT) { + if (data != null) { boolean deleteStatus = false; if (resultCode != Activity.RESULT_OK) { String result = data.getStringExtra("result"); - if (result.contains("does not exist")) - { + if (result.contains("does not exist")) { deleteStatus = true; } } @@ -1053,7 +1047,7 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { } clearCompose(); - } else if( requestCode == Constant.REQUEST_CODE_PROFILE ) { + } else if (requestCode == Constant.REQUEST_CODE_PROFILE) { clearCompose(); } @@ -1296,20 +1290,14 @@ void setComposeTweetDefault() { * */ void setComposeDefault() { - if (this.mCurrentComposeFragment == mComposeTweetFragment) - { + if (this.mCurrentComposeFragment == mComposeTweetFragment) { String draft = mComposeTweetFragment.getTweetDefaultDraft(); - if(draft == null || draft=="") - { + if (draft == null || draft == "") { setComposeTweetDefault(); - } - else - { + } else { mComposeTweetFragment.updateStatusHint(); } - } - else - { + } else { mComposeTweetFragment.clearCompose(false); } } diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneFragment.java index d57c2c04..d8f7d2fa 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneFragment.java @@ -50,7 +50,7 @@ BaseLaneActivity getBaseLaneActivity() { } /* - * + * */ App getApp() { FragmentActivity fragmentActivity = getActivity(); diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BootActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BootActivity.java index 2c2aeb94..0411bb3f 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BootActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BootActivity.java @@ -11,8 +11,6 @@ package com.tweetlanes.android.core.view; -import org.tweetalib.android.TwitterManager; - import android.app.Activity; import android.content.Intent; import android.os.Bundle; @@ -23,6 +21,8 @@ import com.tweetlanes.android.core.Constant; import com.tweetlanes.android.core.ConsumerKeyConstants; +import org.tweetalib.android.TwitterManager; + public class BootActivity extends Activity { private Class mLastStartedClass; @@ -68,7 +68,7 @@ protected void onResume() { } /* - * + * */ void jumpToNext() { diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ComposeBaseFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ComposeBaseFragment.java index abcfc946..cb9cb2d8 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ComposeBaseFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ComposeBaseFragment.java @@ -98,7 +98,7 @@ public interface ComposeListener { boolean mUpdatingStatus = false; /* - * + * */ App getApp() { if (getActivity() == null || getActivity().getApplication() == null) { @@ -171,21 +171,18 @@ public void onResume() { } int getMaxPostLength() { - if (getApp() == null) - { + if (getApp() == null) { return 140; } AccountDescriptor account = getApp().getCurrentAccount(); - if (account == null){ + if (account == null) { return 140; //best to use the lower number in case - } - else - { + } else { return account.getSocialNetType() == SocialNetConstant.Type.Appdotnet ? 256 : 140; - } + } } /* @@ -209,7 +206,8 @@ void showSimpleAlert(int stringID) { alertDialog.setButton(getString(R.string.ok), new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) {} + public void onClick(DialogInterface dialog, int which) { + } }); alertDialog.show(); } @@ -307,10 +305,8 @@ void setIgnoreFocusChange(boolean ignoreFocusChange) { public void afterTextChanged(Editable s) { String asString = s.toString(); configureCharacterCountForString(asString); - if (asString == null || asString.equals("")) - { - if (mListener.getDraft() == null) - { + if (asString == null || asString.equals("")) { + if (mListener.getDraft() == null) { setComposeTweetDefault(null); updateStatusHint(); } @@ -352,17 +348,14 @@ void autoComplete(String text, EditText editText) { mAutocompleteListView.setAdapter(new AutoCompleteMentionAdapter(this.getActivity(), autoCompleteMentions)); mAutocompleteTarget = editText; mAutocompleteListView.setOnItemClickListener(mOnAutoCompleteItemClickListener); - } - else if (lastWholeWord.startsWith("#")) { + } else if (lastWholeWord.startsWith("#")) { List autoCompleteHashtags = getAutoCompleteHashtags(lastWholeWord); mAutocompleteListView.setVisibility(View.VISIBLE); mAutocompleteListView.setAdapter(new AutoCompleteHashtagAdapter(this.getActivity(), autoCompleteHashtags)); mAutocompleteTarget = editText; mAutocompleteListView.setOnItemClickListener(mOnAutoCompleteItemClickListener); - } - - else { + } else { mAutocompleteListView.setVisibility(View.GONE); } } @@ -372,8 +365,7 @@ private class AutoCompleteMentionAdapter extends android.widget.BaseAdapter { final Context mContext; final List mData; - public AutoCompleteMentionAdapter(Context context, List data) - { + public AutoCompleteMentionAdapter(Context context, List data) { mContext = context; mData = data; } @@ -398,18 +390,17 @@ public View getView(int position, View convertView, ViewGroup parent) { View row = convertView; UserHolder holder; - if (row == null) - { - LayoutInflater inflater = ((Activity)mContext).getLayoutInflater(); + if (row == null) { + LayoutInflater inflater = ((Activity) mContext).getLayoutInflater(); row = inflater.inflate(R.layout.autocompletemention_row, parent, false); holder = new UserHolder(); - holder.AvatarImage = (ImageView)row.findViewById(R.id.autoCompleteAvatar); - holder.ScreenName = (TextView)row.findViewById(R.id.autoCompleteScreenName); - holder.FullName = (TextView)row.findViewById(R.id.autoCompleteFullName); + holder.AvatarImage = (ImageView) row.findViewById(R.id.autoCompleteAvatar); + holder.ScreenName = (TextView) row.findViewById(R.id.autoCompleteScreenName); + holder.FullName = (TextView) row.findViewById(R.id.autoCompleteFullName); int dimensionValue = mContext.getResources().getDimensionPixelSize(R.dimen.font_size_medium); - int imageSize = (int)mContext.getResources().getDimension(R.dimen.font_size_medium); + int imageSize = (int) mContext.getResources().getDimension(R.dimen.font_size_medium); holder.ScreenName.setTextSize(TypedValue.COMPLEX_UNIT_PX, dimensionValue); holder.FullName.setTextSize(TypedValue.COMPLEX_UNIT_PX, dimensionValue); @@ -417,16 +408,13 @@ public View getView(int position, View convertView, ViewGroup parent) { holder.AvatarImage.setMaxHeight(imageSize); row.setTag(holder); - } - else - { - holder = (UserHolder)row.getTag(); + } else { + holder = (UserHolder) row.getTag(); } TwitterUser user = mData.get(position); - if (user == null) - { + if (user == null) { return row; } @@ -437,8 +425,7 @@ public View getView(int position, View convertView, ViewGroup parent) { return row; } - class UserHolder - { + class UserHolder { public ImageView AvatarImage; public TextView ScreenName; public TextView FullName; @@ -450,8 +437,7 @@ private class AutoCompleteHashtagAdapter extends android.widget.BaseAdapter { final Context mContext; final List mData; - public AutoCompleteHashtagAdapter(Context context, List data) - { + public AutoCompleteHashtagAdapter(Context context, List data) { mContext = context; mData = data; } @@ -476,29 +462,25 @@ public View getView(int position, View convertView, ViewGroup parent) { View row = convertView; HashtagHolder holder; - if (row == null) - { - LayoutInflater inflater = ((Activity)mContext).getLayoutInflater(); + if (row == null) { + LayoutInflater inflater = ((Activity) mContext).getLayoutInflater(); row = inflater.inflate(R.layout.autocompletehashtag_row, parent, false); holder = new HashtagHolder(); - holder.Hashtag = (TextView)row.findViewById(R.id.autoCompleteHashtag); + holder.Hashtag = (TextView) row.findViewById(R.id.autoCompleteHashtag); int dimensionValue = mContext.getResources().getDimensionPixelSize(R.dimen.font_size_medium); holder.Hashtag.setTextSize(TypedValue.COMPLEX_UNIT_PX, dimensionValue); row.setTag(holder); - } - else - { - holder = (HashtagHolder)row.getTag(); + } else { + holder = (HashtagHolder) row.getTag(); } String hashtag = mData.get(position); - if (hashtag == null) - { + if (hashtag == null) { return row; } @@ -507,8 +489,7 @@ public View getView(int position, View convertView, ViewGroup parent) { return row; } - class HashtagHolder - { + class HashtagHolder { public TextView Hashtag; } } @@ -526,14 +507,15 @@ private void setProfileImage(TwitterUser user, ImageView avatar) { profileImageLoader.displayImage(profileImageUrl, avatar); } } - }} + } + } private final AdapterView.OnItemClickListener mOnAutoCompleteItemClickListener = new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView parent, View view, int position, long id) { - TextView textView = (TextView)view.findViewById(R.id.autoCompleteScreenName); + TextView textView = (TextView) view.findViewById(R.id.autoCompleteScreenName); if (textView == null) { - textView = (TextView)view.findViewById(R.id.autoCompleteHashtag); + textView = (TextView) view.findViewById(R.id.autoCompleteHashtag); } String autoCompleteText = String.valueOf(textView.getText()); @@ -557,8 +539,7 @@ private ArrayList getAutoCompleteMentions(String text) { for (TwitterUser user : users) { if (user.getScreenName().toLowerCase().contains(text.toLowerCase()) || - user.getName().toLowerCase().contains(text.toLowerCase())) - { + user.getName().toLowerCase().contains(text.toLowerCase())) { list.add(user); } } @@ -659,22 +640,17 @@ public void onTouch(View v, MotionEvent event) { */ void clearCompose(boolean saveCurrentTweet) { - if (saveCurrentTweet) - { + if (saveCurrentTweet) { saveCurrentAsDraft(); updateComposeTweetDefault(); - } - else - { + } else { setComposeTweetDefault(null); - if (mListener != null) - { + if (mListener != null) { mListener.onMediaDetach(); } - if(getApp() != null) - { + if (getApp() != null) { getApp().clearTweetDraft(); } } @@ -776,8 +752,7 @@ public void setComposeDefault(ComposeTweetDefault other) { */ void configureCharacterCountForString(String string) { - if (string != null) - { + if (string != null) { int length = mStatusValidator.getTweetLength(string); if (length > 0) { int remaining = getMaxPostLength() - length; @@ -788,14 +763,10 @@ void configureCharacterCountForString(String string) { } mCharacterCountTextView.setText("" + remaining); - } - else - { + } else { mCharacterCountTextView.setText("" + getMaxPostLength()); } - } - else - { + } else { mCharacterCountTextView.setText(""); } } diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ComposeDirectMessageFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ComposeDirectMessageFragment.java index d93056da..5bab1f99 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ComposeDirectMessageFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ComposeDirectMessageFragment.java @@ -69,7 +69,7 @@ public void setOtherUserScreenName(String otherUserScreenName) { } /* - * + * */ private String getOtherUserScreenName() { String otherUserScreenName = mOtherUserScreenName; @@ -90,14 +90,14 @@ private String getOtherUserScreenName() { return otherUserScreenName; } - public void setMediaPreviewVisibility() {} + public void setMediaPreviewVisibility() { + } /* * */ @Override - protected void updateComposeTweetDefault() - { + protected void updateComposeTweetDefault() { String currentStatus = mEditText.getText().toString(); if (Util.isValidString(currentStatus)) { @@ -212,8 +212,8 @@ protected void onSendClick(String status) { int statusLength = mStatusValidator.getTweetLength(status); if (otherUserScreenName == null) { showSimpleAlert(R.string.alert_direct_message_no_recipient); - } else if(statusLength==0){ - showSimpleAlert(R.string.alert_direct_message_empty); + } else if (statusLength == 0) { + showSimpleAlert(R.string.alert_direct_message_empty); } else if (!mStatusValidator.isValidTweet(status)) { showSimpleAlert(mStatusValidator.getTweetLength(status) <= getMaxPostLength() ? R.string.alert_direct_message_invalid : R.string.alert_direct_message_too_long); diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ConversationView.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ConversationView.java index e0a256fd..f32bdcbe 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ConversationView.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ConversationView.java @@ -11,7 +11,17 @@ package com.tweetlanes.android.core.view; +import android.app.Activity; +import android.content.Context; +import android.util.AttributeSet; import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; + +import com.tweetlanes.android.core.R; +import com.tweetlanes.android.core.util.LazyImageLoader; import org.socialnetlib.android.SocialNetConstant; import org.tweetalib.android.TwitterConstant; @@ -23,17 +33,6 @@ import org.tweetalib.android.model.TwitterStatus; import org.tweetalib.android.model.TwitterStatuses; -import android.app.Activity; -import android.content.Context; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.LinearLayout; -import android.widget.RelativeLayout; - -import com.tweetlanes.android.core.R; -import com.tweetlanes.android.core.util.LazyImageLoader; - public class ConversationView extends LinearLayout { private Callbacks mCallbacks; @@ -121,7 +120,7 @@ public void finished(TwitterFetchResult result, } /* - * + * */ private void setStatuses(TwitterStatuses statuses) { diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/DeviceBootReciever.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/DeviceBootReciever.java index 8a43083e..b79b68d9 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/DeviceBootReciever.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/DeviceBootReciever.java @@ -3,6 +3,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; + import com.tweetlanes.android.core.Notifier; public class DeviceBootReciever extends BroadcastReceiver { diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/DirectMessageActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/DirectMessageActivity.java index cceeeda4..d28450d3 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/DirectMessageActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/DirectMessageActivity.java @@ -11,8 +11,6 @@ package com.tweetlanes.android.core.view; -import org.tweetalib.android.TwitterContentHandle; - import android.app.ActionBar; import android.app.Activity; import android.content.Intent; @@ -28,6 +26,8 @@ import com.tweetlanes.android.core.R; import com.tweetlanes.android.core.widget.viewpagerindicator.TitleProvider; +import org.tweetalib.android.TwitterContentHandle; + public class DirectMessageActivity extends BaseLaneActivity { private DirectMessageLaneAdapter mDirectMessageLaneAdapter; @@ -92,7 +92,7 @@ public boolean onOptionsItemSelected(MenuItem item) { } /* - * + * */ @Override public boolean configureOptionsMenu(Menu menu) { diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/DirectMessageFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/DirectMessageFeedFragment.java index 728ac5dd..d28c66f7 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/DirectMessageFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/DirectMessageFeedFragment.java @@ -103,7 +103,7 @@ public void addValues(Bundle args) { private boolean mMoreDirectMessagesAvailable = true; /* - * + * */ public App getApp() { return (App) getActivity().getApplication(); diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/DirectMessageItemView.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/DirectMessageItemView.java index 9a9e3e2b..9068f8b7 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/DirectMessageItemView.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/DirectMessageItemView.java @@ -11,12 +11,6 @@ package com.tweetlanes.android.core.view; -import org.tweetalib.android.TwitterManager; -import org.tweetalib.android.model.TwitterDirectMessage; -import org.tweetalib.android.model.TwitterDirectMessage.MessageType; -import org.tweetalib.android.model.TwitterUser; -import org.tweetalib.android.widget.URLSpanNoUnderline; - import android.app.Activity; import android.content.Context; import android.content.Intent; @@ -40,6 +34,12 @@ import com.tweetlanes.android.core.util.LazyImageLoader; import com.tweetlanes.android.core.util.Util; +import org.tweetalib.android.TwitterManager; +import org.tweetalib.android.model.TwitterDirectMessage; +import org.tweetalib.android.model.TwitterDirectMessage.MessageType; +import org.tweetalib.android.model.TwitterUser; +import org.tweetalib.android.widget.URLSpanNoUnderline; + public class DirectMessageItemView extends LinearLayout { private Context mContext; @@ -233,7 +233,7 @@ public void onClick(View v) { } /* - * + * */ private void onViewClicked() { if (mCallbacks != null) { @@ -270,8 +270,8 @@ void onProfileImageClick() { } } - profileIntent.putExtra("clearCompose","true"); - ((Activity)mContext).startActivityForResult(profileIntent, Constant.REQUEST_CODE_PROFILE ); + profileIntent.putExtra("clearCompose", "true"); + ((Activity) mContext).startActivityForResult(profileIntent, Constant.REQUEST_CODE_PROFILE); } /** diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java index 534fa95e..dcff9f88 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java @@ -109,7 +109,7 @@ protected void onCreate(Bundle savedInstanceState) { Constant.LaneType notificationLaneType = notificationType.equals(SharedPreferencesConstants.NOTIFICATION_TYPE_MENTION) ? Constant.LaneType.USER_MENTIONS : Constant.LaneType.DIRECT_MESSAGES; if (notificationAccount != null) { - long notificationAccountId = notificationAccount.getId(); + long notificationAccountId = notificationAccount.getId(); long currentAccountId = account.getId(); if (notificationAccountId == currentAccountId) { int index = account.getCurrentLaneIndex(notificationLaneType); @@ -171,9 +171,9 @@ protected void onCreate(Bundle savedInstanceState) { whatsNewDialog.show(); } - void clearTempFolder(){ + void clearTempFolder() { - File dir = new File(Environment.getExternalStorageDirectory(),"temp/images/Tweet Lanes"); + File dir = new File(Environment.getExternalStorageDirectory(), "temp/images/Tweet Lanes"); Calendar cal = Calendar.getInstance(); cal.add(Calendar.HOUR, -1); @@ -181,8 +181,7 @@ void clearTempFolder(){ if (files == null) return; for (final File f : files) { Date lastModDate = new Date(f.lastModified()); - if(lastModDate.before(cal.getTime())) - { + if (lastModDate.before(cal.getTime())) { f.delete(); } } @@ -562,7 +561,7 @@ private void showAddAccount() { } /* - * + * */ public void showUserPreferences() { startActivity(new Intent(this, SettingsActivity.class)); @@ -740,8 +739,7 @@ class AccountAdapter extends android.widget.BaseAdapter { final List mData; boolean mShowImages; - public AccountAdapter(Context context, List data) - { + public AccountAdapter(Context context, List data) { mContext = context; mData = new ArrayList(); @@ -757,18 +755,15 @@ public AccountAdapter(Context context, List data) mData.add(new AccountData(account.getId(), "@" + account.getScreenName(), networkType, account.getProfileImageUrl())); - if(networkType== SocialNetConstant.Type.Appdotnet){ + if (networkType == SocialNetConstant.Type.Appdotnet) { seenAdn = true; - } - else - { - seenTwitter=true; + } else { + seenTwitter = true; } } } - if(seenAdn && seenTwitter) - { + if (seenAdn && seenTwitter) { mShowImages = true; } @@ -795,41 +790,34 @@ public View getView(int position, View convertView, ViewGroup parent) { View row = convertView; AccountHolder holder; - if (row == null) - { - LayoutInflater inflater = ((Activity)mContext).getLayoutInflater(); + if (row == null) { + LayoutInflater inflater = ((Activity) mContext).getLayoutInflater(); row = inflater.inflate(R.layout.account_row, parent, false); holder = new AccountHolder(); - holder.AvatarImage = (ImageView)row.findViewById(R.id.accountAvatar); - holder.ServiceImage = (ImageView)row.findViewById(R.id.serviceImage); - holder.ScreenName = (TextView)row.findViewById(R.id.accountScreenName); + holder.AvatarImage = (ImageView) row.findViewById(R.id.accountAvatar); + holder.ServiceImage = (ImageView) row.findViewById(R.id.serviceImage); + holder.ScreenName = (TextView) row.findViewById(R.id.accountScreenName); row.setTag(holder); - } - else - { - holder = (AccountHolder)row.getTag(); + } else { + holder = (AccountHolder) row.getTag(); } AccountData account = mData.get(position); - if (account == null) - { + if (account == null) { return row; } holder.ScreenName.setText(account.ScreenName, TextView.BufferType.NORMAL); - if(AppSettings.get().getCurrentThemeStyle() == R.style.Theme_TweetLanes_Light_DarkActionBar){ + if (AppSettings.get().getCurrentThemeStyle() == R.style.Theme_TweetLanes_Light_DarkActionBar) { holder.ScreenName.setTextColor(getResources().getColor(R.color.white)); } - if (mShowImages) - { + if (mShowImages) { setProfileImage(account.AvatarImageUrl, account.ServiceType, holder.AvatarImage, holder.ServiceImage); - } - else - { + } else { holder.AvatarImage.setVisibility(View.GONE); holder.ServiceImage.setVisibility(View.GONE); } @@ -866,12 +854,11 @@ private void setProfileImage(String profileImageUrl, SocialNetConstant.Type serv profileImageLoader.displayImage(profileImageUrl, avatar); } - } - else { - int resource; - if(AppSettings.get().getCurrentThemeStyle() == R.style.Theme_TweetLanes_Light_DarkActionBar){ - resource = R.drawable.ic_action_user_add_dark; - }else{ + } else { + int resource; + if (AppSettings.get().getCurrentThemeStyle() == R.style.Theme_TweetLanes_Light_DarkActionBar) { + resource = R.drawable.ic_action_user_add_dark; + } else { resource = AppSettings.get().getCurrentThemeStyle() == R.style.Theme_TweetLanes_Light ? R.drawable.ic_action_user_add : diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ImageViewActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ImageViewActivity.java index 0418358c..0e4d7cd2 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ImageViewActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ImageViewActivity.java @@ -179,7 +179,7 @@ public boolean onOptionsItemSelected(MenuItem item) { } /* - * + * */ String getMediaUrl() { String mediaUrl = getIntent().getStringExtra(KEY_MEDIA_URL); diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/InflatedLayoutFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/InflatedLayoutFragment.java index 69bad4af..84458363 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/InflatedLayoutFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/InflatedLayoutFragment.java @@ -35,7 +35,7 @@ public interface Callback { } /* - * + * */ public static InflatedLayoutFragment newInstance(int layoutResourceId) { return newInstance(layoutResourceId, null); diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ProfileActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ProfileActivity.java index b67b3c21..bce82afa 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ProfileActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ProfileActivity.java @@ -11,11 +11,6 @@ package com.tweetlanes.android.core.view; -import org.tweetalib.android.TwitterFetchResult; -import org.tweetalib.android.TwitterFetchUser; -import org.tweetalib.android.TwitterManager; -import org.tweetalib.android.model.TwitterUser; - import android.app.ActionBar; import android.content.Context; import android.content.Intent; @@ -38,6 +33,11 @@ import com.tweetlanes.android.core.model.LaneDescriptor; import com.tweetlanes.android.core.widget.viewpagerindicator.TitleProvider; +import org.tweetalib.android.TwitterFetchResult; +import org.tweetalib.android.TwitterFetchUser; +import org.tweetalib.android.TwitterManager; +import org.tweetalib.android.model.TwitterUser; + public class ProfileActivity extends BaseLaneActivity { private ProfileAdapter mProfileAdapter; @@ -61,8 +61,7 @@ protected void onCreate(Bundle savedInstanceState) { String clearCompose = getIntent().getStringExtra("clearCompose"); boolean savedStateRecreate = false; - if(savedInstanceState != null && savedInstanceState.containsKey("Recreate")) - { + if (savedInstanceState != null && savedInstanceState.containsKey("Recreate")) { savedStateRecreate = savedInstanceState.getBoolean("Recreate"); } @@ -83,8 +82,7 @@ protected void onCreate(Bundle savedInstanceState) { super.setCurrentComposeFragment((fragment instanceof DirectMessageFeedFragment) ? super.COMPOSE_DIRECT_MESSAGE : super.COMPOSE_TWEET); - if((clearCompose != null && clearCompose.equals("true")) && !savedStateRecreate) - { + if ((clearCompose != null && clearCompose.equals("true")) && !savedStateRecreate) { clearCompose(); getIntent().removeExtra("clearCompose"); } @@ -187,7 +185,7 @@ protected FragmentStatePagerAdapter getFragmentStatePagerAdapter() { } /* - * + * */ private void updateViewVisibility() { @@ -296,6 +294,7 @@ public void onBackPressed() { super.onBackPressed(); clearCompose(); } + /* * */ diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ProfileFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ProfileFragment.java index a073adce..d5c2e0b6 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ProfileFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ProfileFragment.java @@ -11,20 +11,6 @@ package com.tweetlanes.android.core.view; -import java.util.ArrayList; - -import org.socialnetlib.android.SocialNetConstant; -import org.tweetalib.android.TwitterFetchBooleans.FinishedCallback; -import org.tweetalib.android.TwitterFetchResult; -import org.tweetalib.android.TwitterFetchUser; -import org.tweetalib.android.TwitterFetchUsers; -import org.tweetalib.android.TwitterManager; -import org.tweetalib.android.TwitterUtil; -import org.tweetalib.android.model.TwitterStatus; -import org.tweetalib.android.model.TwitterUser; -import org.tweetalib.android.model.TwitterUsers; -import org.tweetalib.android.widget.URLSpanNoUnderline; - import android.os.Bundle; import android.text.Html; import android.text.method.LinkMovementMethod; @@ -41,6 +27,20 @@ import com.tweetlanes.android.core.util.Util; import com.tweetlanes.android.core.widget.urlimageviewhelper.UrlImageViewHelper; +import org.socialnetlib.android.SocialNetConstant; +import org.tweetalib.android.TwitterFetchBooleans.FinishedCallback; +import org.tweetalib.android.TwitterFetchResult; +import org.tweetalib.android.TwitterFetchUser; +import org.tweetalib.android.TwitterFetchUsers; +import org.tweetalib.android.TwitterManager; +import org.tweetalib.android.TwitterUtil; +import org.tweetalib.android.model.TwitterStatus; +import org.tweetalib.android.model.TwitterUser; +import org.tweetalib.android.model.TwitterUsers; +import org.tweetalib.android.widget.URLSpanNoUnderline; + +import java.util.ArrayList; + import twitter4j.URLEntity; public class ProfileFragment extends BaseLaneFragment { @@ -68,7 +68,7 @@ public void addValues(Bundle args) { } /* - * + * */ public static ProfileFragment newInstance(int laneIndex, final String screenName) { diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/SettingsActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/SettingsActivity.java index 6ca7742b..15f008db 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/SettingsActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/SettingsActivity.java @@ -423,7 +423,7 @@ public boolean onOptionsItemSelected(MenuItem item) { } /* - * + * */ public class LaneCustomizationAdapter extends ArrayAdapter { diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TutorialActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TutorialActivity.java index eda87c32..5565bd39 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TutorialActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TutorialActivity.java @@ -92,7 +92,7 @@ protected void onCreate(Bundle savedInstanceState) { } /* - * + * */ @Override public boolean onCreateOptionsMenu(Menu menu) { diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index 27c19cb4..a992eeaa 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -170,11 +170,10 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa .registerReceiver(mVolumeDownKeyDownReceiver, new IntentFilter("" + SystemEvent.VOLUME_DOWN_KEY_DOWN)); - if(savedInstanceState != null) - { + if (savedInstanceState != null) { mTwitterStatusIdWhenRefreshed = savedInstanceState.containsKey("TwitterStatusIdWhenRefreshed") ? savedInstanceState.getLong("TwitterStatusIdWhenRefreshed") : null; mLastTwitterStatusIdSeen = savedInstanceState.containsKey("LastTwitterStatusIdSeen") ? savedInstanceState.getLong("LastTwitterStatusIdSeen") : null; - mNewStatuses = savedInstanceState.getInt("NewStatuses",0); + mNewStatuses = savedInstanceState.getInt("NewStatuses", 0); mHidingListHeading = savedInstanceState.getBoolean("HidingListHeading", false); } @@ -182,12 +181,13 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa } @Override - public void onSaveInstanceState(Bundle state) - { + public void onSaveInstanceState(Bundle state) { super.onSaveInstanceState(state); - if (mTwitterStatusIdWhenRefreshed != null) state.putLong("TwitterStatusIdWhenRefreshed", mTwitterStatusIdWhenRefreshed); - if (mLastTwitterStatusIdSeen != null) state.putLong("LastTwitterStatusIdSeen", mLastTwitterStatusIdSeen); + if (mTwitterStatusIdWhenRefreshed != null) + state.putLong("TwitterStatusIdWhenRefreshed", mTwitterStatusIdWhenRefreshed); + if (mLastTwitterStatusIdSeen != null) + state.putLong("LastTwitterStatusIdSeen", mLastTwitterStatusIdSeen); state.putInt("NewStatuses", mNewStatuses); state.putBoolean("HidingListHeading", mHidingListHeading); @@ -235,14 +235,13 @@ void fetchNewestTweets() { } /* - * + * */ void fetchNewestTweets(final long sinceStatusId, Long maxStatusId) { mTweetFeedListView.setRefreshing(); - if (mTweetDataRefreshCallback == null) - { + if (mTweetDataRefreshCallback == null) { mTweetDataRefreshCallback = new TwitterFetchStatusesFinishedCallback() { @Override @@ -263,18 +262,13 @@ public void finished(TwitterFetchResult fetchResult, TwitterStatuses feed, doneGettingStatus = false; } - if(doneGettingStatus) - { + if (doneGettingStatus) { beginListHeadingCount(); onRefreshFinished(fetchResult, feed); - } - else - { + } else { fetchNewestTweets(sinceStatusId, feed.getNewStatusesMaxId()); } - } - else - { + } else { onRefreshFinished(fetchResult, null); } } @@ -299,19 +293,14 @@ public void finished(TwitterFetchResult fetchResult, TwitterStatuses feed, @Override public void UpdateTweetCache(TwitterStatus status, boolean deleteStatus) { TwitterStatuses statusFeed = getStatusFeed(); - if(statusFeed != null) - { + if (statusFeed != null) { TwitterStatus cachedStatus = statusFeed.findByStatusId(status.mId); - if (cachedStatus != null) - { - if(deleteStatus) - { + if (cachedStatus != null) { + if (deleteStatus) { TwitterStatuses selectedStatuses = new TwitterStatuses(cachedStatus); - if(statusFeed!=null) statusFeed.remove(selectedStatuses); - if(_mCachedStatusFeed!=null) _mCachedStatusFeed.remove(selectedStatuses); - } - else - { + if (statusFeed != null) statusFeed.remove(selectedStatuses); + if (_mCachedStatusFeed != null) _mCachedStatusFeed.remove(selectedStatuses); + } else { cachedStatus.setFavorite(status.mIsFavorited); cachedStatus.setRetweet(status.mIsRetweetedByMe); cachedStatus.mFavoriteCount = status.mFavoriteCount; @@ -594,7 +583,7 @@ int getFirstVisibleYOffset() { return mFirstVisibleYOffset; } - ScrollDirection getLastScrollDirection(){ + ScrollDirection getLastScrollDirection() { return mLastScrollDirection; } } @@ -616,8 +605,7 @@ public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCoun if (firstVisibleItem == 1 && view != null && view.getChildAt(firstVisibleItem - 1) != null) { int previousTop = view.getChildAt(firstVisibleItem - 1).getTop(); int previousBottom = view.getChildAt(firstVisibleItem - 1).getBottom(); - if (previousBottom > 0 && previousTop >= -10) - { + if (previousBottom > 0 && previousTop >= -10) { firstVisibleItem--; } } @@ -742,8 +730,7 @@ void updateListHeading(int firstVisibleItem) { if (mTwitterStatusIdWhenRefreshed != null && mTwitterStatusIdWhenRefreshed > 0 && firstVisibleItem > 0) { if (!mHidingListHeading) { TwitterStatus status = getStatusFeed().getStatus(firstVisibleItem); - if((mNewStatuses == 0 || status.mId >= mTwitterStatusIdWhenRefreshed) && status.mId >= mLastTwitterStatusIdSeen) - { + if ((mNewStatuses == 0 || status.mId >= mTwitterStatusIdWhenRefreshed) && status.mId >= mLastTwitterStatusIdSeen) { mNewStatuses = firstVisibleItem; mLastTwitterStatusIdSeen = status.mId; } @@ -776,8 +763,7 @@ private TwitterStatus getVisibleStatus() { if (visiblePosition == 1 && view != null && view.getChildAt(visiblePosition - 1) != null) { int previousTop = view.getChildAt(visiblePosition - 1).getTop(); int previousBottom = view.getChildAt(visiblePosition - 1).getBottom(); - if (previousBottom > 0 && previousTop >= -10) - { + if (previousBottom > 0 && previousTop >= -10) { visiblePosition--; } } @@ -791,18 +777,17 @@ private TwitterStatus getVisibleStatus() { notifcationType = SharedPreferencesConstants.NOTIFICATION_TYPE_MENTION; pref = SharedPreferencesConstants.NOTIFICATION_LAST_DISPLAYED_MENTION_ID; - }else if (getLaneIndex() == getApp().getCurrentAccount().getCurrentLaneIndex(Constant.LaneType.DIRECT_MESSAGES)) { + } else if (getLaneIndex() == getApp().getCurrentAccount().getCurrentLaneIndex(Constant.LaneType.DIRECT_MESSAGES)) { notifcationType = SharedPreferencesConstants.NOTIFICATION_TYPE_DIRECT_MESSAGE; pref = SharedPreferencesConstants.NOTIFICATION_LAST_DISPLAYED_DIRECT_MESSAGE_ID; } - if (notifcationType != null && pref != null ) - { + if (notifcationType != null && pref != null) { - Notifier.saveLastNotificationActioned(getBaseLaneActivity(), - getApp().getCurrentAccountKey(), notifcationType, visibleStatus.mId); - Notifier.cancel(getBaseLaneActivity(), getApp().getCurrentAccountKey(), notifcationType); + Notifier.saveLastNotificationActioned(getBaseLaneActivity(), + getApp().getCurrentAccountKey(), notifcationType, visibleStatus.mId); + Notifier.cancel(getBaseLaneActivity(), getApp().getCurrentAccountKey(), notifcationType); } } @@ -844,11 +829,9 @@ private void onRefreshFinished(TwitterFetchResult result, TwitterStatuses feed) int total = getStatusFeed().getStatusCount(); int newStatuses = 0; - for (int i = 0; i< total; i++) - { - TwitterStatus status = getStatusFeed().getStatus(i); - if(status!= null && status.mId > visibleStatus.mId) - { + for (int i = 0; i < total; i++) { + TwitterStatus status = getStatusFeed().getStatus(i); + if (status != null && status.mId > visibleStatus.mId) { newStatuses++; } } @@ -1058,18 +1041,15 @@ public void run() { */ private void onTweetFeedItemSingleTap(View view, int position) { - if (mSelectedItems.size() == 0) - { + if (mSelectedItems.size() == 0) { TweetFeedItemView tweetFeedItemView = (TweetFeedItemView) (view); TwitterStatus status = tweetFeedItemView.getTwitterStatus(); Intent tweetSpotlightIntent = new Intent(getActivity(), TweetSpotlightActivity.class); tweetSpotlightIntent.putExtra("statusId", Long.toString(status.mId)); tweetSpotlightIntent.putExtra("status", status.toString()); tweetSpotlightIntent.putExtra("clearCompose", "true"); - getActivity().startActivityForResult(tweetSpotlightIntent, Constant.REQUEST_CODE_SPOTLIGHT ); - } - else - { + getActivity().startActivityForResult(tweetSpotlightIntent, Constant.REQUEST_CODE_SPOTLIGHT); + } else { onTweetFeedItemLongPress(view, position); } } @@ -1080,7 +1060,7 @@ private void onTweetFeedItemSingleTap(View view, int position) { private void onTweetFeedItemLongPress(View view, int position) { boolean isChecked = mTweetFeedListView.getRefreshableView().getCheckedItemPositions().get(position); - + TweetFeedItemView tweetFeedItemView = (TweetFeedItemView) (view); @@ -1099,13 +1079,12 @@ private void onTweetFeedItemLongPress(View view, int position) { } mTweetFeedListView.getRefreshableView().setItemChecked(position, !isChecked); - + if (mSelectedItems.size() > 0 && getApp() != null) { mMultipleTweetSelectionCallback .setIsFavorited(getSelectedFavoriteState() == ItemSelectedState.ALL); TwitterStatus firstItem = getFirstSelectedStatus(); - if (firstItem != null) - { + if (firstItem != null) { mMultipleTweetSelectionCallback.setIsRetweet(firstItem.mIsRetweetedByMe); } getBaseLaneActivity().setComposeTweetDefault( @@ -1184,19 +1163,21 @@ private ItemSelectedState getSelectedFavoriteState() { } return ItemSelectedState.NONE; } + /** - * Checks if the status supplied belongs to the user or not by comparing the IDs - * between the ID of the current AccountDescriptor and the User ID of the status - * @param status the TwitterStatus that needs to be checked + * Checks if the status supplied belongs to the user or not by comparing the IDs + * between the ID of the current AccountDescriptor and the User ID of the status + * + * @param status the TwitterStatus that needs to be checked */ private boolean doesTwitterStatusBelongToMe(TwitterStatus status) { - AccountDescriptor currentAccount = getApp().getCurrentAccount(); - if (currentAccount != null && status != null) { - if (currentAccount.getId() == status.mUserId) { - return true; - } - } - return false; + AccountDescriptor currentAccount = getApp().getCurrentAccount(); + if (currentAccount != null && status != null) { + if (currentAccount.getId() == status.mUserId) { + return true; + } + } + return false; } /* @@ -1231,13 +1212,10 @@ public boolean onActionItemClicked(ActionMode mode, MenuItem item) { TwitterStatus statusSelected = getFirstSelectedStatus(); - if(statusSelected.mIsRetweetedByMe) - { + if (statusSelected.mIsRetweetedByMe) { showToast(getString(R.string.cannot_unretweet)); mode.finish(); - } - else - { + } else { TwitterFetchStatus.FinishedCallback callback = TwitterManager.get() .getFetchStatusInstance().new FinishedCallback() { @@ -1245,37 +1223,28 @@ public boolean onActionItemClicked(ActionMode mode, MenuItem item) { @Override public void finished(TwitterFetchResult result, TwitterStatus status) { - if (result != null && result.isSuccessful()) - { - if (status != null && status.mOriginalRetweetId > 0) - { + if (result != null && result.isSuccessful()) { + if (status != null && status.mOriginalRetweetId > 0) { TwitterStatuses cachedStatuses = getStatusFeed(); TwitterStatus cachedStatus = cachedStatuses.findByStatusId(status.mOriginalRetweetId); - if (cachedStatus != null) - { + if (cachedStatus != null) { cachedStatus.setRetweet(true); showToast(getString(R.string.retweeted_successfully)); setIsRetweet(true); - } - else - { + } else { showToast(getString(R.string.retweeted_marking_un_successful)); } - } - else - { + } else { showToast(getString(R.string.retweeted_marking_un_successful)); } - } - else - { + } else { showToast(getString(R.string.retweeted_un_successful)); } } }; - getBaseLaneActivity().retweetSelected(statusSelected,callback); + getBaseLaneActivity().retweetSelected(statusSelected, callback); mode.finish(); } @@ -1296,15 +1265,12 @@ public void finished(boolean successful, TwitterStatuses statuses, Integer value TwitterStatus updatedStatus = statuses.getStatus(i); TwitterStatus cachedStatus = cachedStatuses.findByStatusId(updatedStatus.mId); - if (cachedStatus != null) - { + if (cachedStatus != null) { cachedStatus.setFavorite(updatedStatus.mIsFavorited); - if (!updatedStatus.mIsFavorited){ + if (!updatedStatus.mIsFavorited) { settingFavorited = false; } - } - else - { + } else { showToast(getString(R.string.favorite_marking_un_successful)); } } @@ -1314,9 +1280,7 @@ public void finished(boolean successful, TwitterStatuses statuses, Integer value .unfavorited_successfully)); setIsFavorited(settingFavorited); - } - else - { + } else { boolean newState = getSelectedFavoriteState() != ItemSelectedState.ALL; showToast(getString(newState ? R.string.favorited_un_successfully : R.string .unfavorited_un_successfully)); @@ -1332,7 +1296,7 @@ public void finished(boolean successful, TwitterStatuses statuses, Integer value mode.finish(); } else if (itemId == R.id.action_delete_status) { - TwitterStatuses selectedStatuses = getSelectedStatuses(); + TwitterStatuses selectedStatuses = getSelectedStatuses(); TwitterModifyStatuses.FinishedDeleteCallback callback = TwitterManager.get().getSetStatusesInstance().new FinishedDeleteCallback(selectedStatuses) { @@ -1342,14 +1306,14 @@ public void finished(boolean successful, TwitterStatuses statuses, Integer value showToast(getString(R.string.deleted_successfully)); TwitterStatuses cachedStatuses = getStatusFeed(); - TwitterStatuses selectedStatuses = getSelectedStatuses(); + TwitterStatuses selectedStatuses = getSelectedStatuses(); if (selectedStatuses != null && selectedStatuses.getStatusCount() > 0) { - if(cachedStatuses!=null) cachedStatuses.remove(selectedStatuses); - if(_mCachedStatusFeed!=null) _mCachedStatusFeed.remove(selectedStatuses); + if (cachedStatuses != null) + cachedStatuses.remove(selectedStatuses); + if (_mCachedStatusFeed != null) + _mCachedStatusFeed.remove(selectedStatuses); } - } - else - { + } else { showToast(getString(R.string.deleted_un_successfully)); } } @@ -1366,9 +1330,9 @@ public void finished(boolean successful, TwitterStatuses statuses, Integer value ArrayList userIds = new ArrayList(); for (int i = 0; i < selected.getStatusCount(); i++) { - if (!doesTwitterStatusBelongToMe(selected.getStatus(i))) { - userIds.add(selected.getStatus(i).mUserId); - } + if (!doesTwitterStatusBelongToMe(selected.getStatus(i))) { + userIds.add(selected.getStatus(i).mUserId); + } } TwitterFetchUsers.FinishedCallback callback = @@ -1457,11 +1421,11 @@ void configure(ActionMode mode) { MenuInflater inflater = getActivity().getMenuInflater(); inflater.inflate(R.menu.single_tweet_selected, mode.getMenu()); storeMenuItems(mode.getMenu()); - TwitterStatus firstStatus = getFirstSelectedStatus(); - if (doesTwitterStatusBelongToMe(firstStatus)) { - mode.getMenu().findItem(R.id.action_block).setVisible(false); - mode.getMenu().findItem(R.id.action_report_for_spam).setVisible(false); - } + TwitterStatus firstStatus = getFirstSelectedStatus(); + if (doesTwitterStatusBelongToMe(firstStatus)) { + mode.getMenu().findItem(R.id.action_block).setVisible(false); + mode.getMenu().findItem(R.id.action_report_for_spam).setVisible(false); + } mode.setTitle(""); mode.setSubtitle(""); @@ -1492,7 +1456,7 @@ void storeMenuItems(Menu menu) { MenuItem menuItem = menu.getItem(i); if (menuItem.getItemId() == R.id.action_favorite) { mFavoriteMenuItem = menuItem; - }else if (menuItem.getItemId() == R.id.action_retweet) { + } else if (menuItem.getItemId() == R.id.action_retweet) { mRetweetMenuItem = menuItem; } } @@ -1505,20 +1469,20 @@ void setIsFavorited(boolean favorited) { if (mFavoriteMenuItem != null) { boolean isDarkTheme = AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Dark; if (favorited) { - if(AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Light_DarkAction){ + if (AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Light_DarkAction) { mFavoriteMenuItem.setIcon(R.drawable.ic_action_star_on_dark); mFavoriteMenuItem.setTitle(R.string.action_unfavorite); - }else{ - mFavoriteMenuItem.setIcon( - isDarkTheme ? R.drawable.ic_action_star_on_dark : R.drawable.ic_action_star_on_light); - mFavoriteMenuItem.setTitle(R.string.action_unfavorite); - } + } else { + mFavoriteMenuItem.setIcon( + isDarkTheme ? R.drawable.ic_action_star_on_dark : R.drawable.ic_action_star_on_light); + mFavoriteMenuItem.setTitle(R.string.action_unfavorite); + } } else { - if(AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Light_DarkAction){ + if (AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Light_DarkAction) { mFavoriteMenuItem.setIcon(R.drawable.ic_action_star_off_dark); mFavoriteMenuItem.setTitle(R.string.action_favorite); - } else{ + } else { mFavoriteMenuItem.setIcon( isDarkTheme ? R.drawable.ic_action_star_off_dark : R.drawable.ic_action_star_off_light); mFavoriteMenuItem.setTitle(R.string.action_favorite); diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedItemView.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedItemView.java index 8f66cd38..207f1054 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedItemView.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedItemView.java @@ -25,7 +25,11 @@ import android.text.style.ClickableSpan; import android.util.AttributeSet; import android.util.TypedValue; -import android.view.*; +import android.view.GestureDetector; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewConfiguration; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; @@ -154,16 +158,12 @@ public void configure(TwitterStatus twitterStatus, int position, Callbacks callb if (twitterStatus.mIsRetweet) { String text = verb + " by " + twitterStatus.mUserName; - if (twitterStatus.mRetweetCount > 1) - { + if (twitterStatus.mRetweetCount > 1) { long otherRetweets = (twitterStatus.mRetweetCount - 1); - text += " and " + otherRetweets; - if (otherRetweets > 1) - { - text += " others."; - } - else - { + text += " and " + otherRetweets; + if (otherRetweets > 1) { + text += " others."; + } else { text += " other."; } } @@ -366,7 +366,7 @@ public void onClick(View v) { } /* - * + * */ void insertConversationView() { if (mConversationView == null) { @@ -568,9 +568,9 @@ void onProfileImageClick() { profileIntent.putExtra("userScreenName", mTwitterStatus.getAuthorScreenName()); - profileIntent.putExtra("clearCompose","true"); + profileIntent.putExtra("clearCompose", "true"); - ((Activity)mContext).startActivityForResult(profileIntent, Constant.REQUEST_CODE_PROFILE); + ((Activity) mContext).startActivityForResult(profileIntent, Constant.REQUEST_CODE_PROFILE); } /* diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetSpotlightActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetSpotlightActivity.java index 20eedd24..1df5a6c6 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetSpotlightActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetSpotlightActivity.java @@ -77,8 +77,7 @@ protected void onCreate(Bundle savedInstanceState) { : super.COMPOSE_TWEET); - if(clearCompose != null && clearCompose.equals("true")) - { + if (clearCompose != null && clearCompose.equals("true")) { clearCompose(); getIntent().removeExtra("clearCompose"); } @@ -86,12 +85,9 @@ protected void onCreate(Bundle savedInstanceState) { mViewSwitcher = (ViewSwitcher) findViewById(R.id.rootViewSwitcher); updateViewVisibility(); - if (status.mId == statusId) - { + if (status.mId == statusId) { onGetStatus(status); - } - else if(statusId > 0) - { + } else if (statusId > 0) { mGetStatusCallback = TwitterManager.get().getFetchStatusInstance().new FinishedCallback() { @Override @@ -104,8 +100,8 @@ public void finished(TwitterFetchResult result, } } else { Intent returnIntent = new Intent(); - returnIntent.putExtra("status",mStatus.toString()); - setResult(RESULT_OK,returnIntent); + returnIntent.putExtra("status", mStatus.toString()); + setResult(RESULT_OK, returnIntent); finish(); } mGetStatusCallback = null; @@ -117,29 +113,28 @@ public void finished(TwitterFetchResult result, } else { Intent returnIntent = new Intent(); - returnIntent.putExtra("status",mStatus.toString()); - setResult(RESULT_OK,returnIntent); + returnIntent.putExtra("status", mStatus.toString()); + setResult(RESULT_OK, returnIntent); finish(); } } - void TweetDeleted(String result) - { + void TweetDeleted(String result) { Intent returnIntent = new Intent(); - returnIntent.putExtra("status",mStatus.toString()); + returnIntent.putExtra("status", mStatus.toString()); returnIntent.putExtra("result", result); - setResult(RESULT_CANCELED,returnIntent); + setResult(RESULT_CANCELED, returnIntent); finish(); } @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { + public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { Intent returnIntent = new Intent(); - returnIntent.putExtra("status",mStatus.toString()); - setResult(RESULT_OK,returnIntent); + returnIntent.putExtra("status", mStatus.toString()); + setResult(RESULT_OK, returnIntent); finish(); return true; } @@ -186,7 +181,7 @@ protected FragmentStatePagerAdapter getFragmentStatePagerAdapter() { } /* - * + * */ @Override protected ComposeTweetDefault getComposeTweetDefault() { @@ -246,7 +241,7 @@ public boolean onOptionsItemSelected(MenuItem item) { int i = item.getItemId(); if (i == android.R.id.home) {// app icon in action bar clicked; go home Intent returnIntent = new Intent(); - returnIntent.putExtra("status",mStatus.toString()); + returnIntent.putExtra("status", mStatus.toString()); setResult(RESULT_OK, returnIntent); finish(); return true; @@ -260,22 +255,16 @@ public boolean onOptionsItemSelected(MenuItem item) { @Override public void finished(TwitterFetchResult result, TwitterStatus status) { - if (result != null && result.isSuccessful()) - { - if (status != null && status.mOriginalRetweetId > 0) - { + if (result != null && result.isSuccessful()) { + if (status != null && status.mOriginalRetweetId > 0) { mStatus.mIsRetweetedByMe = true; onGetStatus(mStatus); showToast(getString(R.string.retweeted_successfully)); setIsRetweeted(); - } - else - { + } else { showToast(getString(R.string.retweeted_marking_un_successful)); } - } - else - { + } else { showToast(getString(R.string.retweeted_un_successful)); } @@ -283,12 +272,9 @@ public void finished(TwitterFetchResult result, TwitterStatus status) { }; - if(mStatus.mIsRetweetedByMe) - { + if (mStatus.mIsRetweetedByMe) { showToast(getString(R.string.cannot_unretweet)); - } - else - { + } else { retweetSelected(mStatus, callback); } @@ -318,9 +304,7 @@ public void finished(boolean successful, setIsFavorited(); } - } - else - { + } else { showToast(getString(mStatus.mIsFavorited ? R.string.unfavorited_un_successfully : R.string .favorited_un_successfully)); } @@ -336,8 +320,8 @@ public void finished(boolean successful, } void showToast(String message) { - Toast.makeText(getApplicationContext(), message, - Constant.DEFAULT_TOAST_DISPLAY_TIME).show(); + Toast.makeText(getApplicationContext(), message, + Constant.DEFAULT_TOAST_DISPLAY_TIME).show(); } /** @@ -357,10 +341,8 @@ public boolean configureOptionsMenu(Menu menu) { return false; } - void setIsFavorited() - { - if(mFavoriteMenuItem != null) - { + void setIsFavorited() { + if (mFavoriteMenuItem != null) { boolean isDarkTheme = AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Dark || AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Light_DarkAction; if (mStatus.mIsFavorited) { mFavoriteMenuItem @@ -376,10 +358,8 @@ void setIsFavorited() } } - void setIsRetweeted() - { - if (mRetweetMenuItem != null) - { + void setIsRetweeted() { + if (mRetweetMenuItem != null) { boolean isDarkTheme = AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Dark || AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Light_DarkAction; if (mStatus.mIsRetweetedByMe) { mRetweetMenuItem.setIcon( diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetSpotlightFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetSpotlightFragment.java index 8232418d..45489032 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetSpotlightFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetSpotlightFragment.java @@ -11,11 +11,6 @@ package com.tweetlanes.android.core.view; -import org.tweetalib.android.TwitterFetchResult; -import org.tweetalib.android.TwitterFetchStatus.FinishedCallback; -import org.tweetalib.android.TwitterManager; -import org.tweetalib.android.model.TwitterStatus; - import android.app.Activity; import android.os.Bundle; import android.view.LayoutInflater; @@ -29,6 +24,11 @@ import com.tweetlanes.android.core.widget.pulltorefresh.PullToRefreshBase.OnRefreshListener; import com.tweetlanes.android.core.widget.pulltorefresh.PullToRefreshListView; +import org.tweetalib.android.TwitterFetchResult; +import org.tweetalib.android.TwitterFetchStatus.FinishedCallback; +import org.tweetalib.android.TwitterManager; +import org.tweetalib.android.model.TwitterStatus; + public final class TweetSpotlightFragment extends BaseLaneFragment { public static TweetSpotlightFragment newInstance(int laneIndex, @@ -75,12 +75,9 @@ public void finished(TwitterFetchResult result, TwitterStatus status) { if (mTweetFeedListAdapter != null) { onStatusRefresh(status); updateViewVisibility(); - } - else if(result.getErrorMessage().contains("does not exist")) - { - TweetSpotlightActivity spotlightActivity = (TweetSpotlightActivity)getActivity(); - if (spotlightActivity != null) - { + } else if (result.getErrorMessage().contains("does not exist")) { + TweetSpotlightActivity spotlightActivity = (TweetSpotlightActivity) getActivity(); + if (spotlightActivity != null) { spotlightActivity.TweetDeleted(result.getErrorMessage()); } } @@ -88,9 +85,8 @@ else if(result.getErrorMessage().contains("does not exist")) } }; - TweetSpotlightActivity spotlightActivity = (TweetSpotlightActivity)getActivity(); - if (spotlightActivity != null) - { + TweetSpotlightActivity spotlightActivity = (TweetSpotlightActivity) getActivity(); + if (spotlightActivity != null) { mStatus = spotlightActivity.mStatus; } @@ -126,8 +122,7 @@ public void finished(TwitterFetchResult result, // TODO: Handle error properly if (result.isSuccessful()) { - if(mStatus.mIsRetweet && mStatus.mOriginalRetweetId > 0) - { + if (mStatus.mIsRetweet && mStatus.mOriginalRetweetId > 0) { mGetStatusCallback = TwitterManager.get() .getFetchStatusInstance().new FinishedCallback() { @@ -138,12 +133,9 @@ public void finished(TwitterFetchResult result, if (result.isSuccessful()) { mStatus.mIsRetweetedByMe = status.mIsRetweetedByMe; onStatusRefresh(mStatus); - } - else if(result.getErrorMessage().contains("does not exist")) - { - TweetSpotlightActivity spotlightActivity = (TweetSpotlightActivity)getActivity(); - if (spotlightActivity != null) - { + } else if (result.getErrorMessage().contains("does not exist")) { + TweetSpotlightActivity spotlightActivity = (TweetSpotlightActivity) getActivity(); + if (spotlightActivity != null) { spotlightActivity.TweetDeleted(result.getErrorMessage()); } } @@ -153,17 +145,12 @@ else if(result.getErrorMessage().contains("does not exist")) mStatus = status; TwitterManager.get().getStatus(mStatus.mOriginalRetweetId, mGetStatusCallback); - } - else - { + } else { onStatusRefresh(status); } - } - else if(result.getErrorMessage().contains("does not exist")) - { - TweetSpotlightActivity spotlightActivity = (TweetSpotlightActivity)getActivity(); - if (spotlightActivity != null) - { + } else if (result.getErrorMessage().contains("does not exist")) { + TweetSpotlightActivity spotlightActivity = (TweetSpotlightActivity) getActivity(); + if (spotlightActivity != null) { spotlightActivity.TweetDeleted(result.getErrorMessage()); } } @@ -219,9 +206,8 @@ private void onStatusRefresh(TwitterStatus status) { mStatus = status; mTweetFeedListAdapter.notifyDataSetChanged(); mTweetFeedListView.onRefreshComplete(); - TweetSpotlightActivity spotlightActivity = (TweetSpotlightActivity)getActivity(); - if (spotlightActivity != null) - { + TweetSpotlightActivity spotlightActivity = (TweetSpotlightActivity) getActivity(); + if (spotlightActivity != null) { spotlightActivity.onGetStatus(mStatus); } } diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TwitterAuthActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TwitterAuthActivity.java index 3f4b4f0f..52373f86 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TwitterAuthActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TwitterAuthActivity.java @@ -98,7 +98,7 @@ void onSuccessfulLogin(TwitterUser user, String accessToken, String accessTokenS } /* - * + * */ App getApp() { return (App) getApplication(); diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/UserFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/UserFeedFragment.java index b941e823..8efa8282 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/UserFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/UserFeedFragment.java @@ -100,7 +100,7 @@ public void addValues(Bundle args) { private boolean mMoreUsersAvailable = true; /* - * + * */ public App getApp() { return (App) getActivity().getApplication(); @@ -424,7 +424,7 @@ public void onItemClick(AdapterView parent, View view, int position, profileIntent.putExtra("userId", Long.valueOf(user.getId()) .toString()); profileIntent.putExtra("userScreenName", user.getScreenName()); - getActivity().startActivityForResult(profileIntent, Constant.REQUEST_CODE_PROFILE ); + getActivity().startActivityForResult(profileIntent, Constant.REQUEST_CODE_PROFILE); } } }; diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/UserFeedItemView.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/UserFeedItemView.java index a7acc030..c110db71 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/UserFeedItemView.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/UserFeedItemView.java @@ -11,12 +11,7 @@ package com.tweetlanes.android.core.view; -import org.tweetalib.android.TwitterManager; -import org.tweetalib.android.model.TwitterUser; - -import android.app.Activity; import android.content.Context; -import android.content.Intent; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; @@ -26,11 +21,13 @@ import android.widget.TextView; import com.tweetlanes.android.core.AppSettings; -import com.tweetlanes.android.core.Constant; import com.tweetlanes.android.core.R; import com.tweetlanes.android.core.util.LazyImageLoader; import com.tweetlanes.android.core.view.UserFeedFragment.UserFeedItemViewCallbacks; +import org.tweetalib.android.TwitterManager; +import org.tweetalib.android.model.TwitterUser; + public class UserFeedItemView extends LinearLayout { private Context mContext; diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/EditClearText.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/EditClearText.java index 2753e6b4..c68af595 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/EditClearText.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/EditClearText.java @@ -97,7 +97,7 @@ public interface EditClearTextListener { } /* - * + * */ public void setEditClearTextListener(EditClearTextListener listener) { mListener = listener; diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/gestureimageview/GestureImageView.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/gestureimageview/GestureImageView.java index 24aff85f..0bd85fb0 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/gestureimageview/GestureImageView.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/gestureimageview/GestureImageView.java @@ -10,10 +10,6 @@ */ package com.tweetlanes.android.core.widget.gestureimageview; -import java.io.InputStream; -import java.util.concurrent.Semaphore; -import java.util.concurrent.TimeUnit; - import android.content.Context; import android.content.res.Configuration; import android.database.Cursor; @@ -33,6 +29,10 @@ import android.view.ViewGroup.LayoutParams; import android.widget.ImageView; +import java.io.InputStream; +import java.util.concurrent.Semaphore; +import java.util.concurrent.TimeUnit; + public class GestureImageView extends ImageView { private static final String GLOBAL_NS = "http://schemas.android.com/apk/res/android"; diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/urlimageviewhelper/ContactContentUrlDownloader.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/urlimageviewhelper/ContactContentUrlDownloader.java index af2d1aaf..b3532e9b 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/urlimageviewhelper/ContactContentUrlDownloader.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/urlimageviewhelper/ContactContentUrlDownloader.java @@ -1,13 +1,13 @@ package com.tweetlanes.android.core.widget.urlimageviewhelper; -import java.io.InputStream; - import android.content.ContentResolver; import android.content.Context; import android.net.Uri; import android.os.AsyncTask; import android.provider.ContactsContract; +import java.io.InputStream; + public class ContactContentUrlDownloader implements UrlDownloader { @Override public void download(final Context context, final String url, final String filename, final UrlDownloaderCallback callback, final Runnable completion) { diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/urlimageviewhelper/ContentUrlDownloader.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/urlimageviewhelper/ContentUrlDownloader.java index 2d194701..b3a49809 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/urlimageviewhelper/ContentUrlDownloader.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/urlimageviewhelper/ContentUrlDownloader.java @@ -1,12 +1,12 @@ package com.tweetlanes.android.core.widget.urlimageviewhelper; -import java.io.InputStream; - import android.content.ContentResolver; import android.content.Context; import android.net.Uri; import android.os.AsyncTask; +import java.io.InputStream; + public class ContentUrlDownloader implements UrlDownloader { @Override public void download(final Context context, final String url, final String filename, final UrlDownloaderCallback callback, final Runnable completion) { diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/urlimageviewhelper/FileUrlDownloader.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/urlimageviewhelper/FileUrlDownloader.java index 17b20424..c5b1a399 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/urlimageviewhelper/FileUrlDownloader.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/urlimageviewhelper/FileUrlDownloader.java @@ -1,11 +1,11 @@ package com.tweetlanes.android.core.widget.urlimageviewhelper; -import java.io.File; -import java.net.URI; - import android.content.Context; import android.os.AsyncTask; +import java.io.File; +import java.net.URI; + public class FileUrlDownloader implements UrlDownloader { @Override public void download(final Context context, final String url, final String filename, final UrlDownloaderCallback callback, final Runnable completion) { diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/urlimageviewhelper/HttpUrlDownloader.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/urlimageviewhelper/HttpUrlDownloader.java index ba8eff95..3662c708 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/urlimageviewhelper/HttpUrlDownloader.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/urlimageviewhelper/HttpUrlDownloader.java @@ -1,17 +1,17 @@ package com.tweetlanes.android.core.widget.urlimageviewhelper; -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.net.URL; -import java.util.ArrayList; - -import org.apache.http.NameValuePair; - import android.content.Context; import android.os.AsyncTask; import com.tweetlanes.android.core.widget.urlimageviewhelper.UrlImageViewHelper.RequestPropertiesCallback; +import org.apache.http.NameValuePair; + +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.ArrayList; + public class HttpUrlDownloader implements UrlDownloader { private RequestPropertiesCallback mRequestPropertiesCallback; diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/urlimageviewhelper/UrlDownloader.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/urlimageviewhelper/UrlDownloader.java index 7858627d..087ac491 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/urlimageviewhelper/UrlDownloader.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/urlimageviewhelper/UrlDownloader.java @@ -1,9 +1,9 @@ package com.tweetlanes.android.core.widget.urlimageviewhelper; -import java.io.InputStream; - import android.content.Context; +import java.io.InputStream; + public interface UrlDownloader { public static interface UrlDownloaderCallback { public void onDownloadComplete(UrlDownloader downloader, InputStream in, String filename); diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/urlimageviewhelper/UrlImageViewHelper.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/urlimageviewhelper/UrlImageViewHelper.java index f8b0c75e..1e6b329f 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/urlimageviewhelper/UrlImageViewHelper.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/urlimageviewhelper/UrlImageViewHelper.java @@ -1,19 +1,5 @@ package com.tweetlanes.android.core.widget.urlimageviewhelper; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Hashtable; - -import junit.framework.Assert; - -import org.apache.http.NameValuePair; - import android.annotation.TargetApi; import android.app.ActivityManager; import android.content.Context; @@ -31,6 +17,20 @@ import android.view.WindowManager; import android.widget.ImageView; +import junit.framework.Assert; + +import org.apache.http.NameValuePair; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Hashtable; + public final class UrlImageViewHelper { static void clog(String format, Object... args) { String log; @@ -85,7 +85,7 @@ private static Drawable loadDrawableFromStream(final Context context, final Stri stream = new FileInputStream(filename); BitmapFactory.decodeStream(stream, null, o); stream.close(); - o.inSampleSize =calculateInSampleSize(o, targetWidth, targetHeight); + o.inSampleSize = calculateInSampleSize(o, targetWidth, targetHeight); o.inJustDecodeBounds = false; } stream = new FileInputStream(filename); @@ -176,7 +176,7 @@ private static void setUrlDrawable(final Context context, final ImageView imageV setUrlDrawable(context, imageView, url, d, cacheDurationMs, null); } - /** + /** * Download and shrink an Image located at a specified URL, and display it * in the provided {@link ImageView}. * diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/viewpagerindicator/ListTabPageIndicator.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/viewpagerindicator/ListTabPageIndicator.java index cb54c3fe..6202240c 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/viewpagerindicator/ListTabPageIndicator.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/viewpagerindicator/ListTabPageIndicator.java @@ -1,7 +1,5 @@ package com.tweetlanes.android.core.widget.viewpagerindicator; -import java.util.ArrayList; - import android.content.Context; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; @@ -17,6 +15,8 @@ import com.tweetlanes.android.core.R; +import java.util.ArrayList; + /** * This widget implements the dynamic action bar tab behavior that can change * across different configurations or circumstances. From 89aa77c9025ffb598583de74873c545163aafd39 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Sat, 17 Aug 2013 13:19:24 +0100 Subject: [PATCH 062/163] Run a reformat on social net api. Correct spacing etc --- .../src/com/twitter/Autolink.java | 4 - .../src/com/twitter/Extractor.java | 94 ++-- .../src/com/twitter/HitHighlighter.java | 33 +- .../SocialNetLib/src/com/twitter/Regex.java | 56 +-- .../src/com/twitter/Validator.java | 48 +- .../org/appdotnet4j/model/AdnInteraction.java | 13 +- .../src/org/appdotnet4j/model/AdnPost.java | 9 +- .../src/org/appdotnet4j/model/AdnPosts.java | 4 +- .../src/org/appdotnet4j/model/AdnUsers.java | 4 +- .../src/org/asynctasktex/AsyncTaskEx.java | 282 ++++++------ .../socialnetlib/android/AppdotnetApi.java | 48 +- .../tweetalib/android/ConnectionStatus.java | 2 +- .../android/TwitterContentHandle.java | 8 +- .../android/TwitterContentHandleBase.java | 14 +- .../android/TwitterFetchBooleans.java | 70 +-- .../tweetalib/android/TwitterFetchLists.java | 14 +- .../tweetalib/android/TwitterFetchResult.java | 4 +- .../tweetalib/android/TwitterFetchStatus.java | 95 ++-- .../tweetalib/android/TwitterFetchUser.java | 25 +- .../tweetalib/android/TwitterFetchUsers.java | 411 +++++++++--------- .../org/tweetalib/android/TwitterManager.java | 82 ++-- .../android/TwitterModifyStatuses.java | 128 +++--- .../org/tweetalib/android/TwitterPaging.java | 2 + .../org/tweetalib/android/TwitterSignIn.java | 62 ++- .../org/tweetalib/android/TwitterUtil.java | 15 +- ...rectMessagesFinishedCallbackInterface.java | 2 +- .../fetch/TwitterFetchDirectMessages.java | 84 ++-- .../android/fetch/TwitterFetchStatuses.java | 364 ++++++++-------- .../android/model/TwitterDirectMessage.java | 19 +- .../android/model/TwitterDirectMessages.java | 10 +- .../model/TwitterDirectMessagesHandle.java | 2 +- .../android/model/TwitterMediaEntity.java | 241 +++++----- .../android/model/TwitterStatus.java | 23 +- .../android/model/TwitterStatusUpdate.java | 51 +-- .../android/model/TwitterStatuses.java | 58 +-- .../android/model/TwitterStatusesFilter.java | 2 +- .../tweetalib/android/model/TwitterUser.java | 3 +- .../tweetalib/android/model/TwitterUsers.java | 2 +- .../android/widget/URLSpanNoUnderline.java | 2 +- 39 files changed, 1157 insertions(+), 1233 deletions(-) diff --git a/android/libraries/SocialNetLib/src/com/twitter/Autolink.java b/android/libraries/SocialNetLib/src/com/twitter/Autolink.java index dd9e81ef..36858a25 100644 --- a/android/libraries/SocialNetLib/src/com/twitter/Autolink.java +++ b/android/libraries/SocialNetLib/src/com/twitter/Autolink.java @@ -1,11 +1,7 @@ package com.twitter; -import android.text.TextUtils; - import com.twitter.Extractor.Entity; -import org.tweetalib.android.model.TwitterMediaEntity; - import java.util.LinkedHashMap; import java.util.List; import java.util.Map; diff --git a/android/libraries/SocialNetLib/src/com/twitter/Extractor.java b/android/libraries/SocialNetLib/src/com/twitter/Extractor.java index 919b74b8..4c0ced4a 100755 --- a/android/libraries/SocialNetLib/src/com/twitter/Extractor.java +++ b/android/libraries/SocialNetLib/src/com/twitter/Extractor.java @@ -1,7 +1,11 @@ package com.twitter; -import java.util.*; -import java.util.regex.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; +import java.util.regex.Matcher; /** * A class to extract usernames, lists, hashtags and URLs from Tweet text. @@ -23,7 +27,7 @@ public enum Type { String expandedURL = null; public Entity(int start, int end, String value, String listSlug, - Type type) { + Type type) { this.start = start; this.end = end; this.value = value; @@ -42,7 +46,7 @@ public Entity(Matcher matcher, Type type, int groupNumber) { } public Entity(Matcher matcher, Type type, int groupNumber, - int startOffset) { + int startOffset) { this(matcher.start(groupNumber) + startOffset, matcher .end(groupNumber), matcher.group(groupNumber), type); } @@ -149,9 +153,8 @@ public int compare(Entity e1, Entity e2) { /** * Extract URLs, @mentions, lists and #hashtag from a given text/tweet. - * - * @param text - * text of tweet + * + * @param text text of tweet * @return list of extracted entities */ public List extractEntitiesWithIndices(String text) { @@ -168,9 +171,8 @@ public List extractEntitiesWithIndices(String text) { /** * Extract @username references from Tweet text. A mention is an occurance * of @username anywhere in a Tweet. - * - * @param text - * of the tweet from which to extract usernames + * + * @param text of the tweet from which to extract usernames * @return List of usernames referenced (without the leading @ sign) */ public List extractMentionedScreennames(String text) { @@ -188,9 +190,8 @@ public List extractMentionedScreennames(String text) { /** * Extract @username references from Tweet text. A mention is an occurance * of @username anywhere in a Tweet. - * - * @param text - * of the tweet from which to extract usernames + * + * @param text of the tweet from which to extract usernames * @return List of usernames referenced (without the leading @ sign) */ List extractMentionedScreennamesWithIndices(String text) { @@ -248,9 +249,8 @@ public List extractMentionsOrListsWithIndices(String text) { * Extract a @username reference from the beginning of Tweet text. A reply * is an occurance of @username at the beginning of a Tweet, preceded by 0 * or more spaces. - * - * @param text - * of the tweet from which to extract the replied to username + * + * @param text of the tweet from which to extract the replied to username * @return username referenced, if any (without the leading @ sign). Returns * null if this is not a reply. */ @@ -274,9 +274,8 @@ public String extractReplyScreenname(String text) { /** * Extract URL references from Tweet text. - * - * @param text - * of the tweet from which to extract URLs + * + * @param text of the tweet from which to extract URLs * @return List of URLs referenced. */ public List extractURLs(String text) { @@ -293,16 +292,15 @@ public List extractURLs(String text) { /** * Extract URL references from Tweet text. - * - * @param text - * of the tweet from which to extract URLs + * + * @param text of the tweet from which to extract URLs * @return List of URLs referenced. */ public List extractURLsWithIndices(String text) { if (text == null || text.isEmpty() || (extractURLWithoutProtocol ? text.indexOf('.') : text - .indexOf(':')) == -1) { + .indexOf(':')) == -1) { // Performance optimization. // If text doesn't contain '.' or ':' at all, text doesn't contain // URL, @@ -320,9 +318,9 @@ public List extractURLsWithIndices(String text) { // or URL is preceded by invalid character. if (!extractURLWithoutProtocol || Regex.INVALID_URL_WITHOUT_PROTOCOL_MATCH_BEGIN - .matcher( - matcher.group(Regex.VALID_URL_GROUP_BEFORE)) - .matches()) { + .matcher( + matcher.group(Regex.VALID_URL_GROUP_BEFORE)) + .matches()) { continue; } } @@ -345,9 +343,8 @@ public List extractURLsWithIndices(String text) { /** * Extract #hashtag references from Tweet text. - * - * @param text - * of the tweet from which to extract hashtags + * + * @param text of the tweet from which to extract hashtags * @return List of hashtags referenced (without the leading # sign) */ public List extractHashtags(String text) { @@ -365,9 +362,8 @@ public List extractHashtags(String text) { /** * Extract #hashtag references from Tweet text. - * - * @param text - * of the tweet from which to extract hashtags + * + * @param text of the tweet from which to extract hashtags * @return List of hashtags referenced (without the leading # sign) */ public List extractHashtagsWithIndices(String text) { @@ -376,16 +372,14 @@ public List extractHashtagsWithIndices(String text) { /** * Extract #hashtag references from Tweet text. - * - * @param text - * of the tweet from which to extract hashtags - * @param checkUrlOverlap - * if true, check if extracted hashtags overlap URLs and remove - * overlapping ones + * + * @param text of the tweet from which to extract hashtags + * @param checkUrlOverlap if true, check if extracted hashtags overlap URLs and remove + * overlapping ones * @return List of hashtags referenced (without the leading # sign) */ private List extractHashtagsWithIndices(String text, - boolean checkUrlOverlap) { + boolean checkUrlOverlap) { if (text == null || text.isEmpty()) { return Collections.emptyList(); } @@ -438,9 +432,8 @@ private List extractHashtagsWithIndices(String text, /** * Extract $cashtag references from Tweet text. - * - * @param text - * of the tweet from which to extract cashtags + * + * @param text of the tweet from which to extract cashtags * @return List of cashtags referenced (without the leading $ sign) */ public List extractCashtags(String text) { @@ -458,9 +451,8 @@ public List extractCashtags(String text) { /** * Extract $cashtag references from Tweet text. - * - * @param text - * of the tweet from which to extract cashtags + * + * @param text of the tweet from which to extract cashtags * @return List of cashtags referenced (without the leading $ sign) */ public List extractCashtagsWithIndices(String text) { @@ -509,7 +501,7 @@ public boolean isExtractURLWithoutProtocol() { * @param entities entities with Unicode based indices */ public void modifyIndicesFromUnicodeToUTF16(String text, - List entities) { + List entities) { IndexConverter convert = new IndexConverter(text); for (Entity entity : entities) { @@ -532,7 +524,7 @@ public void modifyIndicesFromUnicodeToUTF16(String text, * @param entities entities with UTF-16 based indices */ public void modifyIndicesFromUTF16ToToUnicode(String text, - List entities) { + List entities) { IndexConverter convert = new IndexConverter(text); for (Entity entity : entities) { @@ -558,8 +550,7 @@ private static final class IndexConverter { } /** - * @param charIndex - * Index into the string measured in code units. + * @param charIndex Index into the string measured in code units. * @return The code point index that corresponds to the specified * character index. */ @@ -578,15 +569,14 @@ int codeUnitsToCodePoints(int charIndex) { // surrogate pair. if (charIndex > 0 && Character.isSupplementaryCodePoint(text - .codePointAt(charIndex - 1))) { + .codePointAt(charIndex - 1))) { this.charIndex -= 1; } return this.codePointIndex; } /** - * @param codePointIndex - * Index into the string measured in code points. + * @param codePointIndex Index into the string measured in code points. * @return the code unit index that corresponds to the specified code * point index. */ diff --git a/android/libraries/SocialNetLib/src/com/twitter/HitHighlighter.java b/android/libraries/SocialNetLib/src/com/twitter/HitHighlighter.java index d43c207f..d62ec3a7 100755 --- a/android/libraries/SocialNetLib/src/com/twitter/HitHighlighter.java +++ b/android/libraries/SocialNetLib/src/com/twitter/HitHighlighter.java @@ -1,20 +1,27 @@ package com.twitter; -import java.util.*; -import java.text.*; +import java.text.CharacterIterator; +import java.text.StringCharacterIterator; +import java.util.List; /** * A class for adding HTML highlighting in Tweet text (such as would be returned * from a Search) */ class HitHighlighter { - /** Default HTML tag for highlight hits */ + /** + * Default HTML tag for highlight hits + */ private static final String DEFAULT_HIGHLIGHT_TAG = "em"; - /** the current HTML tag used for hit highlighting */ + /** + * the current HTML tag used for hit highlighting + */ private String highlightTag; - /** Create a new HitHighlighter object. */ + /** + * Create a new HitHighlighter object. + */ public HitHighlighter() { highlightTag = DEFAULT_HIGHLIGHT_TAG; } @@ -23,12 +30,10 @@ public HitHighlighter() { * Surround the hits in the provided text with an * HTML tag. This is used with offsets from the search API to support the * highlighting of query terms. - * - * @param text - * of the Tweet to highlight - * @param hits - * A List of highlighting offsets (themselves lists of two - * elements) + * + * @param text of the Tweet to highlight + * @param hits A List of highlighting offsets (themselves lists of two + * elements) * @return text with highlight HTML added */ public String highlight(String text, List> hits) { @@ -79,7 +84,7 @@ public String highlight(String text, List> hits) { * Format the current highlightTag by adding < and >. If * closeTag is true then the tag returned will * include a / to signify a closing tag. - * + * * @param true if this is a closing tag, false otherwise */ String tag(boolean closeTag) { @@ -94,7 +99,7 @@ String tag(boolean closeTag) { /** * Get the current HTML tag used for phrase highlighting. - * + * * @return current HTML tag (without < or >) */ public String getHighlightTag() { @@ -103,7 +108,7 @@ public String getHighlightTag() { /** * Set the current HTML tag used for phrase highlighting. - * + * * @param new HTML tag (without < or >) */ public void setHighlightTag(String highlightTag) { diff --git a/android/libraries/SocialNetLib/src/com/twitter/Regex.java b/android/libraries/SocialNetLib/src/com/twitter/Regex.java index 7997ba81..1fbcc53b 100755 --- a/android/libraries/SocialNetLib/src/com/twitter/Regex.java +++ b/android/libraries/SocialNetLib/src/com/twitter/Regex.java @@ -1,14 +1,14 @@ package com.twitter; -import java.util.regex.*; +import java.util.regex.Pattern; class Regex { private static final String UNICODE_SPACES = "[" + "\\u0009-\\u000d" + // # - // White_Space - // # - // Cc - // [5] - // .. + // White_Space + // # + // Cc + // [5] + // .. "\\u0020" + // White_Space # Zs SPACE "\\u0085" + // White_Space # Cc "\\u00a0" + // White_Space # Zs NO-BREAK SPACE @@ -28,11 +28,11 @@ class Regex { + // Latin Extended A and B "\\u0253\\u0254\\u0256\\u0257\\u0259\\u025b\\u0263\\u0268\\u026f\\u0272\\u0289\\u028b" + // IPA - // Extensions + // Extensions "\\u02bb" + // Hawaiian "\\u0300-\\u036f" + // Combining diacritics "\\u1e00-\\u1eff"; // Latin Extended Additional (mostly for - // Vietnamese) + // Vietnamese) private static final String HASHTAG_ALPHA_CHARS = "a-z" + LATIN_ACCENTS_CHARS + "\\u0400-\\u04ff\\u0500-\\u0527" @@ -50,14 +50,14 @@ class Regex { + // Arabic "\\u0750-\\u077f\\u08a0\\u08a2-\\u08ac\\u08e4-\\u08fe" + // Arabic - // Supplement - // and - // Extended - // A + // Supplement + // and + // Extended + // A "\\ufb50-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb" + // Pres. - // Forms - // A + // Forms + // A "\\ufe70-\\ufe74\\ufe76-\\ufefc" + // Pres. Forms B "\\u200c" @@ -66,7 +66,7 @@ class Regex { + // Thai "\\u1100-\\u11ff\\u3130-\\u3185\\uA960-\\uA97F\\uAC00-\\uD7AF\\uD7B0-\\uD7FF" + // Hangul - // (Korean) + // (Korean) "\\p{InHiragana}\\p{InKatakana}" + // Japanese Hiragana and Katakana "\\p{InCJKUnifiedIdeographs}" + // Japanese Kanji / Chinese Han "\\u3003\\u3005\\u303b" + // Kanji/Han iteration marks @@ -130,20 +130,20 @@ class Regex { + URL_VALID_CCTLD + ")" + // protocol - // + - // domain - // + - // ccTLD + // + + // domain + // + + // ccTLD "|(?:" + URL_VALID_UNICODE_CHARS + "+\\." + // protocol + unicode - // domain + TLD + // domain + TLD "(?:" + URL_VALID_GTLD + "|" + URL_VALID_CCTLD + ")" + ")" + ")" + ")" + "|(?:" + // domain - // + - // ccTLD - // + - // '/' + // + + // ccTLD + // + + // '/' URL_VALID_DOMAIN_NAME + URL_VALID_CCTLD + "(?=/)" + // e.g. t.co/ ")"; @@ -154,13 +154,13 @@ class Regex { /** * Allow URL paths to contain balanced parens 1. Used in Wikipedia URLs like * /Primer_(film) 2. Used in IIS sessions like /S(dfd346)/ - **/ + */ private static final String URL_BALANCED_PARENS = "\\(" + URL_VALID_GENERAL_PATH_CHARS + "+\\)"; /** * Valid end-of-path chracters (so /foo. does not gobble the period). 2. * Allow =&# for empty URL parameters and other URL-join artifacts - **/ + */ private static final String URL_VALID_PATH_ENDING_CHARS = "[a-z0-9=_#/\\-\\+" + LATIN_ACCENTS_CHARS + "]|(?:" + URL_BALANCED_PARENS + ")"; @@ -173,13 +173,13 @@ class Regex { private static final String URL_VALID_URL_QUERY_CHARS = "[a-z0-9!?\\*'\\(\\);:&=\\+\\$/%#\\[\\]\\-_\\.,~\\|]"; private static final String URL_VALID_URL_QUERY_ENDING_CHARS = "[a-z0-9_&=#/]"; private static final String VALID_URL_PATTERN_STRING = "(" + // $1 total - // match + // match "(" + URL_VALID_PRECEEDING_CHARS + ")" + // $2 Preceeding chracter "(" + // $3 URL "(https?://)?" + // $4 Protocol (optional) "(" + URL_VALID_DOMAIN + ")" + // $5 Domain(s) "(?::(" + URL_VALID_PORT_NUMBER + "))?" + // $6 Port number - // (optional) + // (optional) "(/" + URL_VALID_PATH + "*+" + ")?" + // $7 URL Path and anchor "(\\?" + URL_VALID_URL_QUERY_CHARS + "*" + // $8 Query String URL_VALID_URL_QUERY_ENDING_CHARS + ")?" + ")" + ")"; diff --git a/android/libraries/SocialNetLib/src/com/twitter/Validator.java b/android/libraries/SocialNetLib/src/com/twitter/Validator.java index 4c95b9a6..88970ba6 100755 --- a/android/libraries/SocialNetLib/src/com/twitter/Validator.java +++ b/android/libraries/SocialNetLib/src/com/twitter/Validator.java @@ -6,44 +6,44 @@ * A class for validating Tweet texts. */ public class Validator { - private static final int MAX_TWEET_LENGTH = 140; + private static final int MAX_TWEET_LENGTH = 140; - private int shortUrlLength = 22; - private int shortUrlLengthHttps = 23; + private int shortUrlLength = 22; + private int shortUrlLengthHttps = 23; - private final Extractor extractor = new Extractor(); + private final Extractor extractor = new Extractor(); - public int getTweetLength(String text) { - text = Normalizer.normalize(text, Normalizer.Form.NFC); - int length = text.codePointCount(0, text.length()); + public int getTweetLength(String text) { + text = Normalizer.normalize(text, Normalizer.Form.NFC); + int length = text.codePointCount(0, text.length()); for (Extractor.Entity urlEntity : extractor .extractURLsWithIndices(text)) { - length += urlEntity.start - urlEntity.end; + length += urlEntity.start - urlEntity.end; length += urlEntity.value.toLowerCase().startsWith("https://") ? shortUrlLengthHttps : shortUrlLength; - } + } - return length; - } + return length; + } - public boolean isValidTweet(String text) { + public boolean isValidTweet(String text) { return isValidTweet(text, MAX_TWEET_LENGTH); } public boolean isValidTweet(String text, int maxLength) { - if (text == null || text.isEmpty()) { - return false; - } - - for (char c : text.toCharArray()) { - if (c == '\uFFFE' || c == '\uuFEFF' || // BOM - c == '\uFFFF' || // Special - (c >= '\u202A' && c <= '\u202E')) { // Direction change - return false; - } - } + if (text == null || text.isEmpty()) { + return false; + } + + for (char c : text.toCharArray()) { + if (c == '\uFFFE' || c == '\uuFEFF' || // BOM + c == '\uFFFF' || // Special + (c >= '\u202A' && c <= '\u202E')) { // Direction change + return false; + } + } return getTweetLength(text) <= maxLength; - } + } } diff --git a/android/libraries/SocialNetLib/src/org/appdotnet4j/model/AdnInteraction.java b/android/libraries/SocialNetLib/src/org/appdotnet4j/model/AdnInteraction.java index cf3e5c96..fde70115 100644 --- a/android/libraries/SocialNetLib/src/org/appdotnet4j/model/AdnInteraction.java +++ b/android/libraries/SocialNetLib/src/org/appdotnet4j/model/AdnInteraction.java @@ -47,17 +47,16 @@ public AdnInteraction(String jsonAsString) { if (mAction.equals("repost")) { verb = "reposted"; } else if (mAction.equals("star")) { - verb = "starred"; + verb = "starred"; } else if (mAction.equals("reply")) { - verb = "replied to"; + verb = "replied to"; } for (AdnPost post : mPosts.mPosts) { String userString = ""; for (AdnUser user : users.mUsers) { if (userString.equals("")) { userString = "@" + user.mUserName; - } - else { + } else { userString += ", " + "@" + user.mUserName; } } @@ -68,16 +67,14 @@ public AdnInteraction(String jsonAsString) { post.mCreatedAt = createdAt; } } - } - else if (mAction.equals("follow") && users != null && users.mUsers != null) { + } else if (mAction.equals("follow") && users != null && users.mUsers != null) { mPosts = new AdnPosts(); String userString = ""; long id = 0; for (AdnUser user : users.mUsers) { if (userString.equals("")) { userString = "@" + user.mUserName; - } - else { + } else { userString += ", " + "@" + user.mUserName; } id += user.mId; diff --git a/android/libraries/SocialNetLib/src/org/appdotnet4j/model/AdnPost.java b/android/libraries/SocialNetLib/src/org/appdotnet4j/model/AdnPost.java index 7f9b59ac..44939ff2 100644 --- a/android/libraries/SocialNetLib/src/org/appdotnet4j/model/AdnPost.java +++ b/android/libraries/SocialNetLib/src/org/appdotnet4j/model/AdnPost.java @@ -11,15 +11,15 @@ package org.appdotnet4j.model; -import java.text.ParseException; -import java.util.Date; - import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.tweetalib.android.TwitterManager; import org.tweetalib.android.TwitterUtil; +import java.text.ParseException; +import java.util.Date; + public class AdnPost { public long mId; @@ -35,7 +35,8 @@ public class AdnPost { public AdnUser mOriginalAuthor; public AdnMedia mEmbeddedMedia; - public AdnPost() {} + public AdnPost() { + } public AdnPost(String jsonAsString) { try { diff --git a/android/libraries/SocialNetLib/src/org/appdotnet4j/model/AdnPosts.java b/android/libraries/SocialNetLib/src/org/appdotnet4j/model/AdnPosts.java index 5963833e..1f536113 100644 --- a/android/libraries/SocialNetLib/src/org/appdotnet4j/model/AdnPosts.java +++ b/android/libraries/SocialNetLib/src/org/appdotnet4j/model/AdnPosts.java @@ -11,12 +11,12 @@ package org.appdotnet4j.model; -import java.util.ArrayList; - import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import java.util.ArrayList; + public class AdnPosts { public ArrayList mPosts; diff --git a/android/libraries/SocialNetLib/src/org/appdotnet4j/model/AdnUsers.java b/android/libraries/SocialNetLib/src/org/appdotnet4j/model/AdnUsers.java index 91aa140e..c17b3b4a 100644 --- a/android/libraries/SocialNetLib/src/org/appdotnet4j/model/AdnUsers.java +++ b/android/libraries/SocialNetLib/src/org/appdotnet4j/model/AdnUsers.java @@ -11,12 +11,12 @@ package org.appdotnet4j.model; -import java.util.ArrayList; - import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import java.util.ArrayList; + public class AdnUsers { public ArrayList mUsers; diff --git a/android/libraries/SocialNetLib/src/org/asynctasktex/AsyncTaskEx.java b/android/libraries/SocialNetLib/src/org/asynctasktex/AsyncTaskEx.java index ba4b5be7..014440f9 100644 --- a/android/libraries/SocialNetLib/src/org/asynctasktex/AsyncTaskEx.java +++ b/android/libraries/SocialNetLib/src/org/asynctasktex/AsyncTaskEx.java @@ -32,11 +32,15 @@ * the License. */ +import android.os.Handler; +import android.os.Message; +import android.os.Process; + import java.util.concurrent.BlockingQueue; import java.util.concurrent.Callable; import java.util.concurrent.CancellationException; -import java.util.concurrent.Executor; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executor; import java.util.concurrent.FutureTask; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadFactory; @@ -46,17 +50,13 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; -import android.os.Handler; -import android.os.Message; -import android.os.Process; - /** *

* AsyncTask enables proper and easy use of the UI thread. This class allows to * perform background operations and publish results on the UI thread without * having to manipulate threads and/or handlers. *

- * + *

*

* AsyncTask is designed to be a helper class around {@link Thread} and * {@link Handler} and does not constitute a generic threading framework. @@ -66,7 +66,7 @@ * java.util.concurrent pacakge such as {@link Executor}, * {@link ThreadPoolExecutor} and {@link FutureTask}. *

- * + *

*

* An asynchronous task is defined by a computation that runs on a background * thread and whose result is published on the UI thread. An asynchronous task @@ -75,7 +75,7 @@ * onPreExecute, doInBackground, * onProgressUpdate and onPostExecute. *

- * + *

*

Developer Guides

*

* For more information about using tasks and threads, read the developer guide. *

*
- * + *

*

Usage

*

* AsyncTask must be subclassed to be used. The subclass will override at least * one method ( {@link #doInBackground}), and most often will override a second * one ({@link #onPostExecute}.) *

- * + *

*

* Here is an example of subclassing: *

- * + *

*

  * private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
- *     protected Long doInBackground(URL... urls) {
- *         int count = urls.length;
- *         long totalSize = 0;
- *         for (int i = 0; i < count; i++) {
- *             totalSize += Downloader.downloadFile(urls[i]);
- *             publishProgress((int) ((i / (float) count) * 100));
- *             // Escape early if cancel() is called
- *             if (isCancelled()) break;
- *         }
- *         return totalSize;
- *     }
- * 
- *     protected void onProgressUpdate(Integer... progress) {
- *         setProgressPercent(progress[0]);
- *     }
- * 
- *     protected void onPostExecute(Long result) {
- *         showDialog("Downloaded " + result + " bytes");
- *     }
+ * protected Long doInBackground(URL... urls) {
+ * int count = urls.length;
+ * long totalSize = 0;
+ * for (int i = 0; i < count; i++) {
+ * totalSize += Downloader.downloadFile(urls[i]);
+ * publishProgress((int) ((i / (float) count) * 100));
+ * // Escape early if cancel() is called
+ * if (isCancelled()) break;
+ * }
+ * return totalSize;
+ * }
+ * 

+ * protected void onProgressUpdate(Integer... progress) { + * setProgressPercent(progress[0]); + * } + *

+ * protected void onPostExecute(Long result) { + * showDialog("Downloaded " + result + " bytes"); + * } * } *

- * + *

*

* Once created, a task is executed very simply: *

- * + *

*

  * new DownloadFilesTask().execute(url1, url2, url3);
  * 
- * + *

*

AsyncTask's generic types

*

* The three types used by an asynchronous task are the following: @@ -144,11 +144,11 @@ * Not all types are always used by an asynchronous task. To mark a type as * unused, simply use the type {@link Void}: *

- * + *

*

  * private class MyTask extends AsyncTask<Void, Void, Void> { ... }
  * 
- * + *

*

The 4 steps

*

* When an asynchronous task is executed, the task goes through 4 steps: @@ -174,7 +174,7 @@ * computation finishes. The result of the background computation is passed to * this step as a parameter. * - * + *

*

Cancelling a task

*

* A task can be cancelled at any time by invoking {@link #cancel(boolean)}. @@ -186,7 +186,7 @@ * {@link #isCancelled()} periodically from {@link #doInBackground(Object[])}, * if possible (inside a loop for instance.) *

- * + *

*

Threading rules

*

* There are a few threading rules that must be followed for this class to work @@ -202,7 +202,7 @@ *

  • The task can be executed only once (an exception will be thrown if a * second execution is attempted.)
  • * - * + *

    *

    Memory observability

    *

    * AsyncTask guarantees that all callback calls are synchronized in such a way @@ -214,7 +214,7 @@ *

  • Set member fields in {@link #doInBackground}, and refer to them in * {@link #onProgressUpdate} and {@link #onPostExecute}. * - * + *

    *

    Order of execution

    *

    * When first introduced, AsyncTasks were executed serially on a single @@ -306,7 +306,9 @@ public enum Status { FINISHED, } - /** @hide Used to force static handler to be created. */ + /** + * @hide Used to force static handler to be created. + */ public static void init() { sHandler.getLooper(); } @@ -364,7 +366,7 @@ private Result postResult(Result result) { /** * Returns the current status of this task. - * + * * @return The current status. */ public final Status getStatus() { @@ -375,15 +377,12 @@ public final Status getStatus() { * Override this method to perform a computation on a background thread. The * specified parameters are the parameters passed to {@link #execute} by the * caller of this task. - * + *

    * This method can call {@link #publishProgress} to publish updates on the * UI thread. - * - * @param params - * The parameters of the task. - * + * + * @param params The parameters of the task. * @return A result, defined by the subclass of this task. - * * @see #onPreExecute() * @see #onPostExecute * @see #publishProgress @@ -404,20 +403,18 @@ void onPreExecute() { * Runs on the UI thread after {@link #doInBackground}. The specified result * is the value returned by {@link #doInBackground}. *

    - * + *

    *

    * This method won't be invoked if the task was cancelled. *

    * - * @param result - * The result of the operation computed by - * {@link #doInBackground}. - * + * @param result The result of the operation computed by + * {@link #doInBackground}. * @see #onPreExecute * @see #doInBackground * @see #onCancelled(Object) */ - @SuppressWarnings({ "UnusedDeclaration" }) + @SuppressWarnings({"UnusedDeclaration"}) protected void onPostExecute(Result result) { } @@ -425,13 +422,11 @@ protected void onPostExecute(Result result) { * Runs on the UI thread after {@link #publishProgress} is invoked. The * specified values are the values passed to {@link #publishProgress}. * - * @param values - * The values indicating progress. - * + * @param values The values indicating progress. * @see #publishProgress * @see #doInBackground */ - @SuppressWarnings({ "UnusedDeclaration" }) + @SuppressWarnings({"UnusedDeclaration"}) protected void onProgressUpdate(Progress... values) { } @@ -440,21 +435,19 @@ protected void onProgressUpdate(Progress... values) { * Runs on the UI thread after {@link #cancel(boolean)} is invoked and * {@link #doInBackground(Object[])} has finished. *

    - * + *

    *

    * The default implementation simply invokes {@link #onCancelled()} and * ignores the result. If you write your own implementation, do not call * super.onCancelled(result). *

    - * - * @param result - * The result, if any, computed in - * {@link #doInBackground(Object[])}, can be null - * + * + * @param result The result, if any, computed in + * {@link #doInBackground(Object[])}, can be null * @see #cancel(boolean) * @see #isCancelled() */ - @SuppressWarnings({ "UnusedParameters" }) + @SuppressWarnings({"UnusedParameters"}) void onCancelled(Result result) { onCancelled(); } @@ -465,12 +458,12 @@ void onCancelled(Result result) { * This method is invoked by the default implementation of * {@link #onCancelled(Object)}. *

    - * + *

    *

    * Runs on the UI thread after {@link #cancel(boolean)} is invoked and * {@link #doInBackground(Object[])} has finished. *

    - * + * * @see #onCancelled(Object) * @see #cancel(boolean) * @see #isCancelled() @@ -483,9 +476,8 @@ void onCancelled() { * normally. If you are calling {@link #cancel(boolean)} on the task, the * value returned by this method should be checked periodically from * {@link #doInBackground(Object[])} to end the task as soon as possible. - * + * * @return true if task was cancelled before it completed - * * @see #cancel(boolean) */ final boolean isCancelled() { @@ -502,7 +494,7 @@ final boolean isCancelled() { * parameter determines whether the thread executing this task should be * interrupted in an attempt to stop the task. *

    - * + *

    *

    * Calling this method will result in {@link #onCancelled(Object)} being * invoked on the UI thread after {@link #doInBackground(Object[])} returns. @@ -512,16 +504,13 @@ final boolean isCancelled() { * {@link #doInBackground(Object[])} to finish the task as early as * possible. *

    - * - * @param mayInterruptIfRunning - * true if the thread executing this task should be - * interrupted; otherwise, in-progress tasks are allowed to - * complete. - * + * + * @param mayInterruptIfRunning true if the thread executing this task should be + * interrupted; otherwise, in-progress tasks are allowed to + * complete. * @return false if the task could not be cancelled, typically * because it has already completed normally; true * otherwise - * * @see #isCancelled() * @see #onCancelled(Object) */ @@ -533,15 +522,11 @@ public final boolean cancel(boolean mayInterruptIfRunning) { /** * Waits if necessary for the computation to complete, and then retrieves * its result. - * + * * @return The computed result. - * - * @throws CancellationException - * If the computation was cancelled. - * @throws ExecutionException - * If the computation threw an exception. - * @throws InterruptedException - * If the current thread was interrupted while waiting. + * @throws CancellationException If the computation was cancelled. + * @throws ExecutionException If the computation threw an exception. + * @throws InterruptedException If the current thread was interrupted while waiting. */ public final Result get() throws InterruptedException, ExecutionException { return mFuture.get(); @@ -550,22 +535,14 @@ public final Result get() throws InterruptedException, ExecutionException { /** * Waits if necessary for at most the given time for the computation to * complete, and then retrieves its result. - * - * @param timeout - * Time to wait before cancelling the operation. - * @param unit - * The time unit for the timeout. - * + * + * @param timeout Time to wait before cancelling the operation. + * @param unit The time unit for the timeout. * @return The computed result. - * - * @throws CancellationException - * If the computation was cancelled. - * @throws ExecutionException - * If the computation threw an exception. - * @throws InterruptedException - * If the current thread was interrupted while waiting. - * @throws TimeoutException - * If the wait timed out. + * @throws CancellationException If the computation was cancelled. + * @throws ExecutionException If the computation threw an exception. + * @throws InterruptedException If the current thread was interrupted while waiting. + * @throws TimeoutException If the wait timed out. */ public final Result get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { @@ -575,8 +552,8 @@ public final Result get(long timeout, TimeUnit unit) /** * Executes the task with the specified parameters. The task returns itself * (this) so that the caller can keep a reference to it. - * - *

    + *

    + *

    * Note: this function schedules the task on a queue for a single background * thread or pool of threads depending on the platform version. When first * introduced, AsyncTasks were executed serially on a single background @@ -588,30 +565,25 @@ public final Result get(long timeout, TimeUnit unit) * parallel execution, you can use the {@link #executeOnExecutor} version of * this method with {@link #THREAD_POOL_EXECUTOR}; however, see commentary * there for warnings on its use. - * - *

    + *

    + *

    * This method must be invoked on the UI thread. - * - * @param params - * The parameters of the task. - * + * + * @param params The parameters of the task. * @return This instance of AsyncTask. - * - * @throws IllegalStateException - * If {@link #getStatus()} returns either - * {@link AsyncTask.Status#RUNNING} or - * {@link AsyncTask.Status#FINISHED}. - * + * @throws IllegalStateException If {@link #getStatus()} returns either + * {@link AsyncTask.Status#RUNNING} or + * {@link AsyncTask.Status#FINISHED}. * @see #executeOnExecutor(java.util.concurrent.Executor, Object[]) * @see #execute(Runnable) */ public final AsyncTaskEx execute(int priority, - Params... params) { + Params... params) { return execute(priority, null, params); } public final AsyncTaskEx execute(int priority, - String description, Params... params) { + String description, Params... params) { return executeOnExecutor(sDefaultExecutor, priority, description, params); } @@ -619,14 +591,14 @@ public final AsyncTaskEx execute(int priority, /** * Executes the task with the specified parameters. The task returns itself * (this) so that the caller can keep a reference to it. - * - *

    + *

    + *

    * This method is typically used with {@link #THREAD_POOL_EXECUTOR} to allow * multiple tasks to run in parallel on a pool of threads managed by * AsyncTask, however you can also use your own {@link Executor} for custom * behavior. - * - *

    + *

    + *

    * Warning: Allowing multiple tasks to run in parallel from a * thread pool is generally not what one wants, because the order * of their operation is not defined. For example, if these tasks are used @@ -637,24 +609,18 @@ public final AsyncTaskEx execute(int priority, * loss and stability issues. Such changes are best executed in serial; to * guarantee such work is serialized regardless of platform version you can * use this function with {@link #DEFAULT_EXECUTOR}. - * - *

    + *

    + *

    * This method must be invoked on the UI thread. - * - * @param exec - * The executor to use. {@link #THREAD_POOL_EXECUTOR} is - * available as a convenient process-wide thread pool for tasks - * that are loosely coupled. - * @param params - * The parameters of the task. - * + * + * @param exec The executor to use. {@link #THREAD_POOL_EXECUTOR} is + * available as a convenient process-wide thread pool for tasks + * that are loosely coupled. + * @param params The parameters of the task. * @return This instance of AsyncTask. - * - * @throws IllegalStateException - * If {@link #getStatus()} returns either - * {@link AsyncTask.Status#RUNNING} or - * {@link AsyncTask.Status#FINISHED}. - * + * @throws IllegalStateException If {@link #getStatus()} returns either + * {@link AsyncTask.Status#RUNNING} or + * {@link AsyncTask.Status#FINISHED}. * @see #execute(Object[]) */ final AsyncTaskEx executeOnExecutor( @@ -662,15 +628,15 @@ final AsyncTaskEx executeOnExecutor( Params... params) { if (mStatus != Status.PENDING) { switch (mStatus) { - case RUNNING: - throw new IllegalStateException("Cannot execute task:" - + " the task is already running."); - case FINISHED: - throw new IllegalStateException("Cannot execute task:" - + " the task has already been executed " - + "(a task can be executed only once)"); - default: - break; + case RUNNING: + throw new IllegalStateException("Cannot execute task:" + + " the task is already running."); + case FINISHED: + throw new IllegalStateException("Cannot execute task:" + + " the task has already been executed " + + "(a task can be executed only once)"); + default: + break; } } @@ -687,7 +653,7 @@ final AsyncTaskEx executeOnExecutor( * Convenience version of {@link #execute(Object...)} for use with a simple * Runnable object. See {@link #execute(Object[])} for more information on * the order of execution. - * + * * @see #execute(Object[]) * @see #executeOnExecutor(java.util.concurrent.Executor, Object[]) */ @@ -700,13 +666,11 @@ public static void execute(Runnable runnable) { * updates on the UI thread while the background computation is still * running. Each call to this method will trigger the execution of * {@link #onProgressUpdate} on the UI thread. - * + *

    * {@link #onProgressUpdate} will note be called if the task has been * canceled. - * - * @param values - * The progress values to update the UI with. - * + * + * @param values The progress values to update the UI with. * @see #onProgressUpdate * @see #doInBackground */ @@ -728,18 +692,18 @@ private void finish(Result result) { } private static class InternalHandler extends Handler { - @SuppressWarnings({ "unchecked", "RawUseOfParameterizedType" }) + @SuppressWarnings({"unchecked", "RawUseOfParameterizedType"}) @Override public void handleMessage(Message msg) { PrioritizedAsyncTaskResult result = (PrioritizedAsyncTaskResult) msg.obj; switch (msg.what) { - case MESSAGE_POST_RESULT: - // There is only one result - result.mTask.finish(result.mData[0]); - break; - case MESSAGE_POST_PROGRESS: - result.mTask.onProgressUpdate(result.mData); - break; + case MESSAGE_POST_RESULT: + // There is only one result + result.mTask.finish(result.mData[0]); + break; + case MESSAGE_POST_PROGRESS: + result.mTask.onProgressUpdate(result.mData); + break; } } } @@ -749,7 +713,7 @@ private static abstract class WorkerRunnable implements Params[] mParams; } - @SuppressWarnings({ "RawUseOfParameterizedType" }) + @SuppressWarnings({"RawUseOfParameterizedType"}) private static class PrioritizedAsyncTaskResult { final AsyncTaskEx mTask; final Data[] mData; diff --git a/android/libraries/SocialNetLib/src/org/socialnetlib/android/AppdotnetApi.java b/android/libraries/SocialNetLib/src/org/socialnetlib/android/AppdotnetApi.java index 0bc8fb47..e9d133c4 100644 --- a/android/libraries/SocialNetLib/src/org/socialnetlib/android/AppdotnetApi.java +++ b/android/libraries/SocialNetLib/src/org/socialnetlib/android/AppdotnetApi.java @@ -14,17 +14,26 @@ import com.turbomanage.httpclient.BasicHttpClient; import com.turbomanage.httpclient.HttpResponse; import com.turbomanage.httpclient.ParameterMap; -import org.appdotnet4j.model.*; + +import org.appdotnet4j.model.AdnFile; +import org.appdotnet4j.model.AdnInteractions; +import org.appdotnet4j.model.AdnPaging; +import org.appdotnet4j.model.AdnPost; +import org.appdotnet4j.model.AdnPostCompose; +import org.appdotnet4j.model.AdnPosts; +import org.appdotnet4j.model.AdnUser; +import org.appdotnet4j.model.AdnUsers; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.tweetalib.android.model.TwitterUser; -import twitter4j.Twitter; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; +import twitter4j.Twitter; + public class AppdotnetApi extends SocialNetApi { /* @@ -116,7 +125,7 @@ public TwitterUser verifyCredentialsSync(String oAuthToken, } /* - * + * */ public TwitterUser getAdnUser(long userId) { @@ -272,7 +281,7 @@ private AdnInteractions getInteractions(String path, ParameterMap params) { params = new ParameterMap(); } String interactionString = doGet(path, params); - if (interactionString!= null) { + if (interactionString != null) { return new AdnInteractions(interactionString); } @@ -308,8 +317,8 @@ public AdnPost setAdnStatus(AdnPostCompose compose) { try { post = new JSONObject() - .put("text", compose.mText) - .put("reply_to", compose.mInReplyTo); + .put("text", compose.mText) + .put("reply_to", compose.mInReplyTo); if (compose.mMediaFile != null) { @@ -327,8 +336,7 @@ public AdnPost setAdnStatus(AdnPostCompose compose) { post.put("annotations", new JSONArray().put(ann)); } - } - catch (JSONException e) { + } catch (JSONException e) { e.printStackTrace(); return null; } @@ -346,10 +354,10 @@ private AdnFile setAdnFile(File file) { JSONObject json; try { json = new JSONObject() - .put("kind", "image") - .put("type", "com.tweetlanes.image") - .put("public", "0") - .put("name", file.getName()); + .put("kind", "image") + .put("type", "com.tweetlanes.image") + .put("public", "0") + .put("name", file.getName()); JSONObject response = new JSONObject(doPost("/stream/0/files", json)); if (response.has("data")) { @@ -367,19 +375,15 @@ private AdnFile setAdnFile(File file) { if (isResponseValid(httpResponse)) { return new AdnFile(id, fileToken); } - } - catch (JSONException e) { + } catch (JSONException e) { e.printStackTrace(); return null; - } - catch (IOException e) { + } catch (IOException e) { e.printStackTrace(); return null; } - - return null; } @@ -419,8 +423,7 @@ public AdnPost setAdnFavorite(long existingPostId, boolean favorite) { HttpResponse httpResponse; if (favorite) { httpResponse = httpClient.post("/stream/0/posts/" + existingPostId + "/star", null); - } - else { + } else { httpResponse = httpClient.delete("/stream/0/posts/" + existingPostId + "/star", null); } @@ -504,7 +507,7 @@ public SocialNetConstant.Type getSocialNetType() { return SocialNetConstant.Type.Appdotnet; } - private static byte[] readFile (File file) throws IOException { + private static byte[] readFile(File file) throws IOException { // Open file RandomAccessFile f = new RandomAccessFile(file, "r"); @@ -518,8 +521,7 @@ private static byte[] readFile (File file) throws IOException { byte[] data = new byte[length]; f.readFully(data); return data; - } - finally { + } finally { f.close(); } } diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/ConnectionStatus.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/ConnectionStatus.java index 647676ff..5e860e2d 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/ConnectionStatus.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/ConnectionStatus.java @@ -21,7 +21,7 @@ public class ConnectionStatus { private final Callbacks mCallbacks; /* - * + * */ public ConnectionStatus(Callbacks callbacks) { mCallbacks = callbacks; diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterContentHandle.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterContentHandle.java index fd0e07b2..543575ec 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterContentHandle.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterContentHandle.java @@ -19,12 +19,12 @@ public class TwitterContentHandle extends TwitterContentHandleBase { /** - * - */ + * + */ private static final long serialVersionUID = 231396385372202288L; - public TwitterContentHandle(TwitterContentHandleBase contentHandleBase, - String screenName, String identifier, String currentAccountKey) { + public TwitterContentHandle(TwitterContentHandleBase contentHandleBase, + String screenName, String identifier, String currentAccountKey) { super(contentHandleBase); mScreenName = screenName; diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterContentHandleBase.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterContentHandleBase.java index 415dc2a1..137664f3 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterContentHandleBase.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterContentHandleBase.java @@ -16,19 +16,19 @@ package org.tweetalib.android; -import java.io.Serializable; - import org.tweetalib.android.TwitterConstant.ContentType; import org.tweetalib.android.TwitterConstant.DirectMessagesType; import org.tweetalib.android.TwitterConstant.StatusType; import org.tweetalib.android.TwitterConstant.StatusesType; import org.tweetalib.android.TwitterConstant.UsersType; +import java.io.Serializable; + public class TwitterContentHandleBase implements Serializable { /** - * - */ + * + */ private static final long serialVersionUID = 4132026070249216175L; TwitterContentHandleBase(TwitterContentHandleBase other) { @@ -40,7 +40,7 @@ public class TwitterContentHandleBase implements Serializable { } public TwitterContentHandleBase(ContentType contentType, - DirectMessagesType directMessagesType) { + DirectMessagesType directMessagesType) { this(contentType, directMessagesType, null, null, null); } @@ -49,12 +49,12 @@ public TwitterContentHandleBase(ContentType contentType) { } public TwitterContentHandleBase(ContentType contentType, - StatusType statusType) { + StatusType statusType) { this(contentType, null, statusType, null, null); } public TwitterContentHandleBase(ContentType contentType, - StatusesType statusesType) { + StatusesType statusesType) { this(contentType, null, null, statusesType, null); } diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterFetchBooleans.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterFetchBooleans.java index 1c9bcd43..7435173e 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterFetchBooleans.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterFetchBooleans.java @@ -11,14 +11,14 @@ package org.tweetalib.android; -import java.util.ArrayList; -import java.util.HashMap; - import org.asynctasktex.AsyncTaskEx; import org.socialnetlib.android.AppdotnetApi; import org.tweetalib.android.TwitterConstant.BooleanType; import org.tweetalib.android.model.TwitterUser; +import java.util.ArrayList; +import java.util.HashMap; + import twitter4j.Friendship; import twitter4j.ResponseList; import twitter4j.Twitter; @@ -31,7 +31,7 @@ public class TwitterFetchBooleans { private final HashMap mFinishedCallbackMap; /* - * + * */ public void clearCallbacks() { if (mFinishedCallbackMap != null) { @@ -55,7 +55,7 @@ public interface FetchBooleansWorkerCallbacks { public interface FinishedCallbackInterface { public void finished(TwitterFetchResult result, - ArrayList returnValues); + ArrayList returnValues); } @@ -123,8 +123,8 @@ AppdotnetApi getAppdotnetInstance() { * */ public void getFriendshipExists(String userScreenName, - String userScreenNameToCheck, FinishedCallback callback, - ConnectionStatus connectionStatus) { + String userScreenNameToCheck, FinishedCallback callback, + ConnectionStatus connectionStatus) { triggerFetchBooleanTask(new FetchBooleanTaskInput( mFetchBooleanCallbackHandle, connectionStatus, @@ -136,7 +136,7 @@ public void getFriendshipExists(String userScreenName, * */ void triggerFetchBooleanTask(FetchBooleanTaskInput taskInput, - FinishedCallback callback, ConnectionStatus connectionStatus) { + FinishedCallback callback, ConnectionStatus connectionStatus) { if (connectionStatus != null && !connectionStatus.isOnline()) { if (callback != null) { @@ -166,8 +166,8 @@ public void cancel(FinishedCallback callback) { class FetchBooleanTaskInput { FetchBooleanTaskInput(Integer callbackHandle, - ConnectionStatus connectionStatus, BooleanType booleanType, - String userScreenName, String userScreenNameToCheck) { + ConnectionStatus connectionStatus, BooleanType booleanType, + String userScreenName, String userScreenNameToCheck) { mCallbackHandle = callbackHandle; mConnectionStatus = connectionStatus; mBooleanType = booleanType; @@ -188,7 +188,7 @@ class FetchBooleanTaskInput { class FetchBooleanTaskOutput { FetchBooleanTaskOutput(TwitterFetchResult result, - Integer callbackHandle, ArrayList returnValues) { + Integer callbackHandle, ArrayList returnValues) { mResult = result; mCallbackHandle = callbackHandle; if (returnValues != null) { @@ -226,20 +226,20 @@ protected FetchBooleanTaskOutput doInBackground( if (twitter != null) { try { switch (input.mBooleanType) { - case FRIENDSHIP_EXISTS: { - if (!input.mUserScreenName.toLowerCase().equals( - input.mUserScreenNameToCheck.toLowerCase())) { - ResponseList response = twitter - .lookupFriendships(new String[] { input.mUserScreenName }); - if (response != null && response.size() == 1) { - result.add(response.get(0).isFollowedBy()); - result.add(response.get(0).isFollowing()); + case FRIENDSHIP_EXISTS: { + if (!input.mUserScreenName.toLowerCase().equals( + input.mUserScreenNameToCheck.toLowerCase())) { + ResponseList response = twitter + .lookupFriendships(new String[]{input.mUserScreenName}); + if (response != null && response.size() == 1) { + result.add(response.get(0).isFollowedBy()); + result.add(response.get(0).isFollowing()); + } } + break; } - break; - } - default: - break; + default: + break; } } catch (TwitterException e) { @@ -248,20 +248,20 @@ protected FetchBooleanTaskOutput doInBackground( } } else if (appdotnet != null) { switch (input.mBooleanType) { - case FRIENDSHIP_EXISTS: { - if (!input.mUserScreenName.toLowerCase().equals( - input.mUserScreenNameToCheck.toLowerCase())) { - TwitterUser user = appdotnet - .getAdnUser(input.mUserScreenName); - if (user != null) { - result.add(user.getFollowsCurrentUser()); - result.add(user.getCurrentUserFollows()); + case FRIENDSHIP_EXISTS: { + if (!input.mUserScreenName.toLowerCase().equals( + input.mUserScreenNameToCheck.toLowerCase())) { + TwitterUser user = appdotnet + .getAdnUser(input.mUserScreenName); + if (user != null) { + result.add(user.getFollowsCurrentUser()); + result.add(user.getCurrentUserFollows()); + } } + break; } - break; - } - default: - break; + default: + break; } } diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterFetchLists.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterFetchLists.java index ec84682f..88051cd0 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterFetchLists.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterFetchLists.java @@ -16,13 +16,13 @@ package org.tweetalib.android; -import java.util.HashMap; - import android.util.Log; -import org.asynctasktex.AsyncTaskEx; +import org.asynctasktex.AsyncTaskEx; import org.tweetalib.android.model.TwitterLists; +import java.util.HashMap; + import twitter4j.ResponseList; import twitter4j.Twitter; import twitter4j.TwitterException; @@ -36,10 +36,10 @@ public class TwitterFetchLists { private final HashMap mFinishedCallbackMap; /* - * + * */ public void clearCallbacks() { - if (mFinishedCallbackMap != null ) { + if (mFinishedCallbackMap != null) { mFinishedCallbackMap.clear(); } } @@ -148,7 +148,7 @@ private void trigger(Integer userId, FinishedCallback callback) { mFinishedCallbackMap.put(mFetchListsCallbackHandle, callback); new FetchListsTask().execute(AsyncTaskEx.PRIORITY_MEDIUM, "Fetch Lists", new FetchListsTaskInput(userId, - mFetchListsCallbackHandle)); + mFetchListsCallbackHandle)); mFetchListsCallbackHandle += 1; } @@ -160,7 +160,7 @@ private void trigger(String screenName, FinishedCallback callback) { mFinishedCallbackMap.put(mFetchListsCallbackHandle, callback); new FetchListsTask().execute(AsyncTaskEx.PRIORITY_MEDIUM, "Fetch Lists", new FetchListsTaskInput(screenName, - mFetchListsCallbackHandle)); + mFetchListsCallbackHandle)); mFetchListsCallbackHandle += 1; } diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterFetchResult.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterFetchResult.java index d3db3bd3..16447a9b 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterFetchResult.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterFetchResult.java @@ -22,7 +22,7 @@ public class TwitterFetchResult { final String mErrorMessage; /* - * + * */ public TwitterFetchResult(boolean successful, String errorMessage) { mSuccessful = successful; @@ -30,7 +30,7 @@ public TwitterFetchResult(boolean successful, String errorMessage) { if (!mSuccessful && TwitterManager.get() != null && TwitterManager.get().getConnectionStatus() != null) { - TwitterManager.get().getConnectionStatus().handleError(this); + TwitterManager.get().getConnectionStatus().handleError(this); } } diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterFetchStatus.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterFetchStatus.java index 3d3c5ced..2be1bba3 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterFetchStatus.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterFetchStatus.java @@ -11,9 +11,8 @@ package org.tweetalib.android; -import java.util.HashMap; - import android.util.Log; + import org.appdotnet4j.model.AdnPost; import org.appdotnet4j.model.AdnPostCompose; import org.asynctasktex.AsyncTaskEx; @@ -22,6 +21,8 @@ import org.tweetalib.android.model.TwitterStatus; import org.tweetalib.android.model.TwitterStatusUpdate; +import java.util.HashMap; + import twitter4j.StatusUpdate; import twitter4j.Twitter; import twitter4j.TwitterException; @@ -34,10 +35,10 @@ public class TwitterFetchStatus { private final HashMap mFinishedCallbackMap; /* - * + * */ public void clearCallbacks() { - if (mFinishedCallbackMap != null ) { + if (mFinishedCallbackMap != null) { mFinishedCallbackMap.clear(); } } @@ -127,7 +128,7 @@ AppdotnetApi getAppdotnetApi() { * */ public TwitterStatus getStatus(long statusId, FinishedCallback callback, - ConnectionStatus connectionStatus) { + ConnectionStatus connectionStatus) { triggerFetchStatusTask(new FetchStatusTaskInput( mFetchStatusCallbackHandle, StatusType.GET_STATUS, statusId, @@ -139,7 +140,7 @@ public TwitterStatus getStatus(long statusId, FinishedCallback callback, * */ public void setStatus(TwitterStatusUpdate statusUpdate, - FinishedCallback callback, ConnectionStatus connectionStatus) { + FinishedCallback callback, ConnectionStatus connectionStatus) { triggerFetchStatusTask(new FetchStatusTaskInput( mFetchStatusCallbackHandle, statusUpdate, connectionStatus), @@ -150,7 +151,7 @@ public void setStatus(TwitterStatusUpdate statusUpdate, * */ public void setRetweet(long statusId, FinishedCallback callback, - ConnectionStatus connectionStatus) { + ConnectionStatus connectionStatus) { triggerFetchStatusTask(new FetchStatusTaskInput( mFetchStatusCallbackHandle, StatusType.SET_RETWEET, statusId, connectionStatus), callback, connectionStatus); @@ -160,7 +161,7 @@ public void setRetweet(long statusId, FinishedCallback callback, * */ void triggerFetchStatusTask(FetchStatusTaskInput taskInput, - FinishedCallback callback, ConnectionStatus connectionStatus) { + FinishedCallback callback, ConnectionStatus connectionStatus) { if (connectionStatus != null && !connectionStatus.isOnline()) { if (callback != null) { @@ -190,8 +191,8 @@ public void cancel(FinishedCallback callback) { class FetchStatusTaskInput { FetchStatusTaskInput(Integer callbackHandle, - TwitterStatusUpdate statusUpdate, - ConnectionStatus connectionStatus) { + TwitterStatusUpdate statusUpdate, + ConnectionStatus connectionStatus) { mCallbackHandle = callbackHandle; mStatusUpdate = statusUpdate; mStatusType = StatusType.SET_STATUS; @@ -199,7 +200,7 @@ class FetchStatusTaskInput { } FetchStatusTaskInput(Integer callbackHandle, StatusType statusType, - long existingStatus, ConnectionStatus connectionStatus) { + long existingStatus, ConnectionStatus connectionStatus) { mCallbackHandle = callbackHandle; mExistingStatusId = existingStatus; mStatusType = statusType; @@ -219,7 +220,7 @@ class FetchStatusTaskInput { class FetchStatusTaskOutput { FetchStatusTaskOutput(TwitterFetchResult result, - Integer callbackHandle, TwitterStatus status) { + Integer callbackHandle, TwitterStatus status) { mResult = result; mCallbackHandle = callbackHandle; mStatus = status; @@ -255,23 +256,23 @@ protected FetchStatusTaskOutput doInBackground( if (appdotnetApi != null) { AdnPost status = null; switch (input.mStatusType) { - case SET_STATUS: - AdnPostCompose post = input.mStatusUpdate.getAdnComposePost(); - appdotnetApi.setAdnStatus(post); - break; - - case GET_STATUS: { - status = appdotnetApi.getAdnPost(input.mExistingStatusId); - break; - } + case SET_STATUS: + AdnPostCompose post = input.mStatusUpdate.getAdnComposePost(); + appdotnetApi.setAdnStatus(post); + break; - case SET_RETWEET: { - status = appdotnetApi.setAdnRepost(input.mExistingStatusId); - break; - } + case GET_STATUS: { + status = appdotnetApi.getAdnPost(input.mExistingStatusId); + break; + } + + case SET_RETWEET: { + status = appdotnetApi.setAdnRepost(input.mExistingStatusId); + break; + } - default: - break; + default: + break; } if (status != null) { @@ -282,17 +283,17 @@ protected FetchStatusTaskOutput doInBackground( try { switch (input.mStatusType) { - case GET_STATUS: { - Log.d("api-call", "showStatus"); - status = twitter.showStatus(input.mExistingStatusId); - break; - } - - case SET_STATUS: { - Log.d("api-call", "updateStatus"); - StatusUpdate statusUpdate = input.mStatusUpdate - .getT4JStatusUpdate(); - status = twitter.updateStatus(statusUpdate); + case GET_STATUS: { + Log.d("api-call", "showStatus"); + status = twitter.showStatus(input.mExistingStatusId); + break; + } + + case SET_STATUS: { + Log.d("api-call", "updateStatus"); + StatusUpdate statusUpdate = input.mStatusUpdate + .getT4JStatusUpdate(); + status = twitter.updateStatus(statusUpdate); /* * Configuration conf = getConfiguration(); @@ -331,15 +332,15 @@ protected FetchStatusTaskOutput doInBackground( * e.printStackTrace(); } } */ - // status = twitter.showStatus(181681943774117888L); - break; - } + // status = twitter.showStatus(181681943774117888L); + break; + } - case SET_RETWEET: { - Log.d("api-call", "retweetStatus"); - status = twitter.retweetStatus(input.mExistingStatusId); - break; - } + case SET_RETWEET: { + Log.d("api-call", "retweetStatus"); + status = twitter.retweetStatus(input.mExistingStatusId); + break; + } } @@ -351,7 +352,7 @@ protected FetchStatusTaskOutput doInBackground( errorDescription += "\nTry again in " + e.getRateLimitStatus().getSecondsUntilReset() + " " + "seconds"; } - }catch (OutOfMemoryError e) { + } catch (OutOfMemoryError e) { e.printStackTrace(); errorDescription = e.getMessage(); Log.e("api-call", errorDescription, e); diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterFetchUser.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterFetchUser.java index fac017f7..cae4ede6 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterFetchUser.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterFetchUser.java @@ -40,10 +40,10 @@ public class TwitterFetchUser { private final HashMap mFinishedCallbackMap; /* - * + * */ public void clearCallbacks() { - if (mFinishedCallbackMap != null ) { + if (mFinishedCallbackMap != null) { mFinishedCallbackMap.clear(); } } @@ -172,7 +172,7 @@ public void setUser(AdnUser user, boolean forceUpdate) { * */ public TwitterUser getUser(Long userId, FinishedCallback callback, - ConnectionStatus connectionStatus) { + ConnectionStatus connectionStatus) { TwitterUser user = mUserIdHashMap.get(userId); @@ -184,7 +184,7 @@ public TwitterUser getUser(Long userId, FinishedCallback callback, } public TwitterUser getUser(String screenName, FinishedCallback callback, - ConnectionStatus connectionStatus) { + ConnectionStatus connectionStatus) { TwitterUser user = mUserScreenNameHashMap.get(screenName); @@ -200,8 +200,7 @@ public List getCachedUsers() { } public TwitterUser getCachedUser(Long userId) { - if (!mUserIdHashMap.containsKey(userId)) - { + if (!mUserIdHashMap.containsKey(userId)) { return null; } return mUserIdHashMap.get(userId); @@ -212,7 +211,7 @@ public TwitterUser getCachedUser(Long userId) { * */ public void verifyUser(FinishedCallback callback, - ConnectionStatus connectionStatus) { + ConnectionStatus connectionStatus) { if (connectionStatus != null && !connectionStatus.isOnline()) { if (callback != null) { @@ -233,7 +232,7 @@ public void verifyUser(FinishedCallback callback, * */ private void trigger(Long userId, FinishedCallback callback, - ConnectionStatus connectionStatus) { + ConnectionStatus connectionStatus) { if (connectionStatus != null && !connectionStatus.isOnline()) { if (callback != null) { @@ -254,7 +253,7 @@ private void trigger(Long userId, FinishedCallback callback, } private void trigger(String screenName, FinishedCallback callback, - ConnectionStatus connectionStatus) { + ConnectionStatus connectionStatus) { if (connectionStatus != null && !connectionStatus.isOnline()) { if (callback != null) { @@ -288,21 +287,21 @@ public void cancel(FinishedCallback callback) { class FetchUserTaskInput { FetchUserTaskInput(Long userId, Integer callbackHandle, - ConnectionStatus connectionStatus) { + ConnectionStatus connectionStatus) { mCallbackHandle = callbackHandle; mUserId = userId; mConnectionStatus = connectionStatus; } FetchUserTaskInput(String screenName, Integer callbackHandle, - ConnectionStatus connectionStatus) { + ConnectionStatus connectionStatus) { mCallbackHandle = callbackHandle; mScreenName = screenName; mConnectionStatus = connectionStatus; } FetchUserTaskInput(Integer callbackHandle, - ConnectionStatus connectionStatus) { + ConnectionStatus connectionStatus) { mCallbackHandle = callbackHandle; mVerifyCredentials = true; mConnectionStatus = connectionStatus; @@ -322,7 +321,7 @@ class FetchUserTaskInput { class FetchUserTaskOutput { FetchUserTaskOutput(TwitterFetchResult fetchResult, - Integer callbackHandle, TwitterUser user) { + Integer callbackHandle, TwitterUser user) { mFetchResult = fetchResult; mCallbackHandle = callbackHandle; mUser = user; diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterFetchUsers.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterFetchUsers.java index c58cddef..3debdbdb 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterFetchUsers.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterFetchUsers.java @@ -40,10 +40,10 @@ public class TwitterFetchUsers { private final HashMap mFinishedCallbackMap; /* - * + * */ public void clearCallbacks() { - if (mFinishedCallbackMap != null ) { + if (mFinishedCallbackMap != null) { mFinishedCallbackMap.clear(); } } @@ -169,7 +169,7 @@ TwitterIds getUserIds(TwitterContentHandle handle) { * */ public TwitterUsers getUsers(TwitterContentHandle contentHandle, - TwitterPaging paging) { + TwitterPaging paging) { TwitterIds ids = getUserIds(contentHandle); @@ -192,8 +192,8 @@ public TwitterUsers getUsers(TwitterContentHandle contentHandle, * */ public TwitterUsers getUsers(TwitterContentHandle contentHandle, - TwitterPaging paging, FinishedCallback callback, - ConnectionStatus connectionStatus) { + TwitterPaging paging, FinishedCallback callback, + ConnectionStatus connectionStatus) { TwitterUsers result = getUsers(contentHandle, paging); if (result == null) { @@ -225,8 +225,8 @@ void trigger(TwitterContentHandle contentHandle, mFinishedCallbackMap.put(mFetchUsersCallbackHandle, callback); new FetchUsersTask().execute(AsyncTaskEx.PRIORITY_MEDIUM, "Fetch Users", new FetchUsersTaskInput( - mFetchUsersCallbackHandle, contentHandle, - connectionStatus, paging)); + mFetchUsersCallbackHandle, contentHandle, + connectionStatus, paging)); mFetchUsersCallbackHandle += 1; } @@ -243,15 +243,15 @@ public void cancel(FinishedCallback callback) { * */ public void updateFriendshipUser(String currentUserScreenName, - TwitterUser userToUpdate, boolean create, - FinishedCallback callback, ConnectionStatus connectionStatus) { + TwitterUser userToUpdate, boolean create, + FinishedCallback callback, ConnectionStatus connectionStatus) { updateFriendshipUsers(currentUserScreenName, new TwitterUsers( userToUpdate), create, callback, connectionStatus); } public void updateFriendshipUsers(String currentUserScreenName, - TwitterUsers usersToUpdate, boolean create, - FinishedCallback callback, ConnectionStatus connectionStatus) { + TwitterUsers usersToUpdate, boolean create, + FinishedCallback callback, ConnectionStatus connectionStatus) { ArrayList userScreenNames = new ArrayList(); for (int i = 0; i < usersToUpdate.getUserCount(); i++) { userScreenNames.add(usersToUpdate.getUser(i).getScreenName()); @@ -264,8 +264,8 @@ public void updateFriendshipUsers(String currentUserScreenName, * */ public void updateFriendshipScreenName(String currentUserScreenName, - String screenNameToUpdate, boolean create, - FinishedCallback callback, ConnectionStatus connectionStatus) { + String screenNameToUpdate, boolean create, + FinishedCallback callback, ConnectionStatus connectionStatus) { ArrayList userScreenNames = new ArrayList(); userScreenNames.add(screenNameToUpdate); updateFriendshipScreenNames(currentUserScreenName, userScreenNames, @@ -275,8 +275,8 @@ public void updateFriendshipScreenName(String currentUserScreenName, private static int _mFriendshipCounter = 0; public void updateFriendshipScreenNames(String currentUserScreenName, - ArrayList userScreenNamesToUpdate, boolean create, - FinishedCallback callback, ConnectionStatus connectionStatus) { + ArrayList userScreenNamesToUpdate, boolean create, + FinishedCallback callback, ConnectionStatus connectionStatus) { if (connectionStatus != null && !connectionStatus.isOnline()) { if (callback != null) { @@ -304,8 +304,8 @@ public void updateFriendshipScreenNames(String currentUserScreenName, * */ public void updateFriendshipUserId(long currentUserId, Long userIdToUpdate, - boolean create, FinishedCallback callback, - ConnectionStatus connectionStatus) { + boolean create, FinishedCallback callback, + ConnectionStatus connectionStatus) { ArrayList userIds = new ArrayList(); userIds.add(userIdToUpdate); updateFriendshipUserIds(currentUserId, userIds, create, callback, @@ -313,8 +313,8 @@ public void updateFriendshipUserId(long currentUserId, Long userIdToUpdate, } public void updateFriendshipUserIds(long currentUserId, - ArrayList userIdsToUpdate, boolean create, - FinishedCallback callback, ConnectionStatus connectionStatus) { + ArrayList userIdsToUpdate, boolean create, + FinishedCallback callback, ConnectionStatus connectionStatus) { if (connectionStatus != null && !connectionStatus.isOnline()) { if (callback != null) { callback.finished(new TwitterFetchResult(false, @@ -333,16 +333,16 @@ public void updateFriendshipUserIds(long currentUserId, mFinishedCallbackMap.put(mFetchUsersCallbackHandle, callback); new FetchUsersTask().execute(AsyncTaskEx.PRIORITY_MEDIUM, "Update Friendships", new FetchUsersTaskInput( - mFetchUsersCallbackHandle, contentHandle, - connectionStatus, null, userIdsToUpdate, create)); + mFetchUsersCallbackHandle, contentHandle, + connectionStatus, null, userIdsToUpdate, create)); } /* * */ private void createBlockOrReportSpam(UsersType usersType, - long currentUserId, Long userId, FinishedCallback callback, - ConnectionStatus connectionStatus) { + long currentUserId, Long userId, FinishedCallback callback, + ConnectionStatus connectionStatus) { ArrayList userIds = new ArrayList(); userIds.add(userId); createBlockOrReportSpam(usersType, currentUserId, userIds, callback, @@ -350,8 +350,8 @@ private void createBlockOrReportSpam(UsersType usersType, } private void createBlockOrReportSpam(UsersType usersType, - long currentUserId, ArrayList userIds, - FinishedCallback callback, ConnectionStatus connectionStatus) { + long currentUserId, ArrayList userIds, + FinishedCallback callback, ConnectionStatus connectionStatus) { if (connectionStatus != null && !connectionStatus.isOnline()) { if (callback != null) { callback.finished(new TwitterFetchResult(false, @@ -369,21 +369,21 @@ private void createBlockOrReportSpam(UsersType usersType, mFinishedCallbackMap.put(mFetchUsersCallbackHandle, callback); new FetchUsersTask().execute(AsyncTaskEx.PRIORITY_MEDIUM, "Block or Report", new FetchUsersTaskInput( - mFetchUsersCallbackHandle, contentHandle, - connectionStatus, userIds)); + mFetchUsersCallbackHandle, contentHandle, + connectionStatus, userIds)); } /* * */ public void reportSpam(long currentUserId, Long userId, - FinishedCallback callback, ConnectionStatus connectionStatus) { + FinishedCallback callback, ConnectionStatus connectionStatus) { createBlockOrReportSpam(UsersType.REPORT_SPAM, currentUserId, userId, callback, connectionStatus); } public void reportSpam(long currentUserId, ArrayList userIds, - FinishedCallback callback, ConnectionStatus connectionStatus) { + FinishedCallback callback, ConnectionStatus connectionStatus) { createBlockOrReportSpam(UsersType.REPORT_SPAM, currentUserId, userIds, callback, connectionStatus); } @@ -392,13 +392,13 @@ public void reportSpam(long currentUserId, ArrayList userIds, * */ public void createBlock(long currentUserId, Long userId, - FinishedCallback callback, ConnectionStatus connectionStatus) { + FinishedCallback callback, ConnectionStatus connectionStatus) { createBlockOrReportSpam(UsersType.CREATE_BLOCK, currentUserId, userId, callback, connectionStatus); } public void createBlock(long currentUserId, ArrayList userIds, - FinishedCallback callback, ConnectionStatus connectionStatus) { + FinishedCallback callback, ConnectionStatus connectionStatus) { createBlockOrReportSpam(UsersType.CREATE_BLOCK, currentUserId, userIds, callback, connectionStatus); } @@ -409,8 +409,8 @@ public void createBlock(long currentUserId, ArrayList userIds, class FetchUsersTaskInput { FetchUsersTaskInput(Integer callbackHandle, - TwitterContentHandle contentHandle, - ConnectionStatus connectionStatus, TwitterPaging paging) { + TwitterContentHandle contentHandle, + ConnectionStatus connectionStatus, TwitterPaging paging) { mCallbackHandle = callbackHandle; mContentHandle = contentHandle; mConnectionStatus = connectionStatus; @@ -418,8 +418,8 @@ class FetchUsersTaskInput { } FetchUsersTaskInput(Integer callbackHandle, - TwitterContentHandle contentHandle, - ConnectionStatus connectionStatus, ArrayList userIds) { + TwitterContentHandle contentHandle, + ConnectionStatus connectionStatus, ArrayList userIds) { mCallbackHandle = callbackHandle; mContentHandle = contentHandle; mConnectionStatus = connectionStatus; @@ -427,10 +427,10 @@ class FetchUsersTaskInput { } FetchUsersTaskInput(Integer callbackHandle, - TwitterContentHandle contentHandle, - ConnectionStatus connectionStatus, - ArrayList userScreenNames, ArrayList userIds, - boolean createFriendship) { + TwitterContentHandle contentHandle, + ConnectionStatus connectionStatus, + ArrayList userScreenNames, ArrayList userIds, + boolean createFriendship) { mCallbackHandle = callbackHandle; mContentHandle = contentHandle; mConnectionStatus = connectionStatus; @@ -455,7 +455,7 @@ class FetchUsersTaskInput { class FetchUsersTaskOutput { FetchUsersTaskOutput(TwitterFetchResult result, Integer callbackHandle, - TwitterUsers users) { + TwitterUsers users) { mResult = result; mCallbackHandle = callbackHandle; mUsers = users; @@ -495,73 +495,73 @@ protected FetchUsersTaskOutput doInBackground( AdnUsers users = null; switch (usersType) { - case FRIENDS: { - ids = appdotnet.getAdnFollowing(); - setUsers(input.mContentHandle, ids); - break; - } - - case FOLLOWERS: { - ids = appdotnet.getAdnFollowedBy(); - setUsers(input.mContentHandle, ids); - break; - } + case FRIENDS: { + ids = appdotnet.getAdnFollowing(); + setUsers(input.mContentHandle, ids); + break; + } - case RETWEETED_BY: { - try { - long postId = Long.valueOf(input.mContentHandle - .getIdentifier()); - users = appdotnet.getUsersWhoReposted(postId); + case FOLLOWERS: { + ids = appdotnet.getAdnFollowedBy(); setUsers(input.mContentHandle, ids); - } catch (NumberFormatException e) { + break; } - break; - } - case UPDATE_FRIENDSHIP: { - twitterUsers = new TwitterUsers(); + case RETWEETED_BY: { + try { + long postId = Long.valueOf(input.mContentHandle + .getIdentifier()); + users = appdotnet.getUsersWhoReposted(postId); + setUsers(input.mContentHandle, ids); + } catch (NumberFormatException e) { + } + break; + } - if (input.mScreenNames != null) { - for (String screenName : input.mScreenNames) { - AdnUser user = null; - // We can't follow ourself... - if (!screenName.toLowerCase().equals( - input.mContentHandle.getScreenName() - .toLowerCase())) { - if (input.mCreateFriendship) { - user = appdotnet.setAdnFollow(screenName, - true); - } else { - user = appdotnet.setAdnFollow(screenName, - false); + case UPDATE_FRIENDSHIP: { + twitterUsers = new TwitterUsers(); + + if (input.mScreenNames != null) { + for (String screenName : input.mScreenNames) { + AdnUser user = null; + // We can't follow ourself... + if (!screenName.toLowerCase().equals( + input.mContentHandle.getScreenName() + .toLowerCase())) { + if (input.mCreateFriendship) { + user = appdotnet.setAdnFollow(screenName, + true); + } else { + user = appdotnet.setAdnFollow(screenName, + false); + } } - } - if (user != null) { - twitterUsers.add(new TwitterUser(user)); - } - } - } else if (input.mUserIds != null) { - - long currentUserId = Long - .parseLong(input.mContentHandle.getScreenName()); - - for (Long userId : input.mUserIds) { - AdnUser user = null; - // We can't follow ourself... - if (currentUserId != userId) { - if (input.mCreateFriendship) { - user = appdotnet.setAdnFollow(userId, true); - } else { - user = appdotnet - .setAdnFollow(userId, false); + if (user != null) { + twitterUsers.add(new TwitterUser(user)); } } - if (user != null) { - twitterUsers.add(new TwitterUser(user)); + } else if (input.mUserIds != null) { + + long currentUserId = Long + .parseLong(input.mContentHandle.getScreenName()); + + for (Long userId : input.mUserIds) { + AdnUser user = null; + // We can't follow ourself... + if (currentUserId != userId) { + if (input.mCreateFriendship) { + user = appdotnet.setAdnFollow(userId, true); + } else { + user = appdotnet + .setAdnFollow(userId, false); + } + } + if (user != null) { + twitterUsers.add(new TwitterUser(user)); + } } } } - } } @@ -597,131 +597,131 @@ protected FetchUsersTaskOutput doInBackground( try { switch (usersType) { - case FRIENDS: { - Log.d("api-call", "getFriendsIDs"); - userIds = twitter.getFriendsIDs(-1); - setUsers(input.mContentHandle, userIds); - break; - } - - case FOLLOWERS: { - Log.d("api-call", "getFollowersIDs"); - userIds = twitter.getFollowersIDs(-1); - setUsers(input.mContentHandle, userIds); - break; - } + case FRIENDS: { + Log.d("api-call", "getFriendsIDs"); + userIds = twitter.getFriendsIDs(-1); + setUsers(input.mContentHandle, userIds); + break; + } - case RETWEETED_BY: { - Log.d("api-call", "getRetweets"); - long statusId = Long.parseLong(input.mContentHandle - .getIdentifier()); - ResponseList statuses = twitter - .getRetweets(statusId); + case FOLLOWERS: { + Log.d("api-call", "getFollowersIDs"); + userIds = twitter.getFollowersIDs(-1); + setUsers(input.mContentHandle, userIds); + break; + } - if (statuses != null) { - twitterUsers = new TwitterUsers(); - for (twitter4j.Status status : statuses) { - mWorkerCallbacks.addUser(status.getUser()); - twitterUsers.add(new TwitterUser(status - .getUser())); + case RETWEETED_BY: { + Log.d("api-call", "getRetweets"); + long statusId = Long.parseLong(input.mContentHandle + .getIdentifier()); + ResponseList statuses = twitter + .getRetweets(statusId); + + if (statuses != null) { + twitterUsers = new TwitterUsers(); + for (twitter4j.Status status : statuses) { + mWorkerCallbacks.addUser(status.getUser()); + twitterUsers.add(new TwitterUser(status + .getUser())); + } } + break; } - break; - } - case PEOPLE_SEARCH: { - Log.d("api-call", "searchUsers"); - String searchTerm = input.mContentHandle - .getScreenName(); - users = twitter.searchUsers(searchTerm, 0); - break; - } + case PEOPLE_SEARCH: { + Log.d("api-call", "searchUsers"); + String searchTerm = input.mContentHandle + .getScreenName(); + users = twitter.searchUsers(searchTerm, 0); + break; + } - case UPDATE_FRIENDSHIP: { - twitterUsers = new TwitterUsers(); + case UPDATE_FRIENDSHIP: { + twitterUsers = new TwitterUsers(); - if (input.mScreenNames != null) { - for (String screenName : input.mScreenNames) { - User user = null; - // We can't follow ourself... - if (!screenName.toLowerCase().equals( - input.mContentHandle.getScreenName() - .toLowerCase())) { - if (input.mCreateFriendship) { - Log.d("api-call", "createFriendship"); - user = twitter - .createFriendship(screenName); - } else { - Log.d("api-call", "destroyFriendship"); - user = twitter - .destroyFriendship(screenName); + if (input.mScreenNames != null) { + for (String screenName : input.mScreenNames) { + User user = null; + // We can't follow ourself... + if (!screenName.toLowerCase().equals( + input.mContentHandle.getScreenName() + .toLowerCase())) { + if (input.mCreateFriendship) { + Log.d("api-call", "createFriendship"); + user = twitter + .createFriendship(screenName); + } else { + Log.d("api-call", "destroyFriendship"); + user = twitter + .destroyFriendship(screenName); + } + } + if (user != null) { + twitterUsers.add(new TwitterUser(user)); } } - if (user != null) { - twitterUsers.add(new TwitterUser(user)); + } else if (input.mUserIds != null) { + + long currentUserId = Long + .parseLong(input.mContentHandle + .getScreenName()); + + for (Long userId : input.mUserIds) { + User user = null; + // We can't follow ourself... + if (currentUserId != userId) { + if (input.mCreateFriendship) { + Log.d("api-call", "createFriendship"); + user = twitter.createFriendship(userId); + } else { + Log.d("api-call", "destroyFriendship"); + user = twitter + .destroyFriendship(userId); + } + } + if (user != null) { + twitterUsers.add(new TwitterUser(user)); + } } } - } else if (input.mUserIds != null) { - long currentUserId = Long - .parseLong(input.mContentHandle - .getScreenName()); + if (twitterUsers.getUserCount() == 0) { + twitterUsers = null; + } + + break; + } + case CREATE_BLOCK: + case REPORT_SPAM: { + twitterUsers = new TwitterUsers(); + long currentUserId = Long + .parseLong(input.mContentHandle.getScreenName()); for (Long userId : input.mUserIds) { User user = null; - // We can't follow ourself... + // We can't act on ourself... if (currentUserId != userId) { - if (input.mCreateFriendship) { - Log.d("api-call", "createFriendship"); - user = twitter.createFriendship(userId); - } else { - Log.d("api-call", "destroyFriendship"); - user = twitter - .destroyFriendship(userId); + if (usersType == UsersType.CREATE_BLOCK) { + Log.d("api-call", "createBlock"); + user = twitter.createBlock(userId); + } else if (usersType == UsersType.REPORT_SPAM) { + Log.d("api-call", "reportSpam"); + user = twitter.reportSpam(userId); + } + if (user != null) { + twitterUsers.add(new TwitterUser(user)); } - } - if (user != null) { - twitterUsers.add(new TwitterUser(user)); } } - } - - if (twitterUsers.getUserCount() == 0) { - twitterUsers = null; - } - - break; - } - case CREATE_BLOCK: - case REPORT_SPAM: { - twitterUsers = new TwitterUsers(); - long currentUserId = Long - .parseLong(input.mContentHandle.getScreenName()); - for (Long userId : input.mUserIds) { - User user = null; - // We can't act on ourself... - if (currentUserId != userId) { - if (usersType == UsersType.CREATE_BLOCK) { - Log.d("api-call", "createBlock"); - user = twitter.createBlock(userId); - } else if (usersType == UsersType.REPORT_SPAM) { - Log.d("api-call", "reportSpam"); - user = twitter.reportSpam(userId); - } - if (user != null) { - twitterUsers.add(new TwitterUser(user)); - } + if (twitterUsers.getUserCount() == 0) { + twitterUsers = null; } - } - if (twitterUsers.getUserCount() == 0) { - twitterUsers = null; + break; } - break; - } - } if (userIds != null) { @@ -731,14 +731,12 @@ protected FetchUsersTaskOutput doInBackground( int finish = numberToFetch; ArrayList fetchIds = new ArrayList(); boolean check = true; - while (check) - { + while (check) { //Establish ids for this batch for (int i = start; i < finish; i++) { fetchIds.add(ids[i]); - if(ids.length-1 == i) - { + if (ids.length - 1 == i) { check = false; break; } @@ -750,18 +748,15 @@ protected FetchUsersTaskOutput doInBackground( //Convert arraylist into long[] long[] longArray = new long[fetchIds.size()]; - for (int i = 0; i < fetchIds.size(); i++){ + for (int i = 0; i < fetchIds.size(); i++) { longArray[i] = fetchIds.get(i); } fetchIds.clear(); //Get this batch of users - if (users==null) - { - users = twitter.lookupUsers(longArray); - } - else - { + if (users == null) { + users = twitter.lookupUsers(longArray); + } else { users.addAll(twitter.lookupUsers(longArray)); } } diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterManager.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterManager.java index 1646aafa..34a4645c 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterManager.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterManager.java @@ -45,9 +45,9 @@ public class TwitterManager { // / TODO: This is probably too C++ ish. Will come back to this later... public static void initModule(SocialNetConstant.Type socNetType, - String consumerKey, String consumerSecret, String oAuthToken, - String oAuthSecret, String currentAccountKey, - ConnectionStatus.Callbacks connectionStatusCallbacks) { + String consumerKey, String consumerSecret, String oAuthToken, + String oAuthSecret, String currentAccountKey, + ConnectionStatus.Callbacks connectionStatusCallbacks) { mInstance = new TwitterManager(socNetType, consumerKey, consumerSecret, currentAccountKey); mInstance.setOAuthTokenWithSecret(oAuthToken, oAuthSecret, true); mInstance.setConnectionStatus(connectionStatusCallbacks); @@ -70,7 +70,7 @@ public static TwitterManager get() { private SocialNetApi mApi; /* - * + * */ private TwitterManager(SocialNetConstant.Type socialNetType, String consumerKey, String consumerSecret, String currentAccountKey) { @@ -82,25 +82,24 @@ public SocialNetConstant.Type getSocialNetType() { } public void setSocialNetType(SocialNetConstant.Type socialNetType, - String consumerKey, String consumerSecret, String currentAccountKey) { + String consumerKey, String consumerSecret, String currentAccountKey) { switch (socialNetType) { - case Appdotnet: - mApi = new AppdotnetApi(socialNetType, consumerKey, consumerSecret, currentAccountKey); - break; + case Appdotnet: + mApi = new AppdotnetApi(socialNetType, consumerKey, consumerSecret, currentAccountKey); + break; - default: - mApi = new TwitterApi(socialNetType, consumerKey, consumerSecret, currentAccountKey); - break; + default: + mApi = new TwitterApi(socialNetType, consumerKey, consumerSecret, currentAccountKey); + break; } } - /* * */ public void setOAuthTokenWithSecret(String oAuthToken, String oAuthSecret, - boolean cancelPending) { + boolean cancelPending) { mApi.setOAuthTokenWithSecret(oAuthToken, oAuthSecret, cancelPending); } @@ -138,10 +137,10 @@ public enum ProfileImageSize { NORMAL, // 48x48 BIGGER, // 73x73 ORIGINAL, // undefined. This will be the size the image was originally - // uploaded in. - // The filesize of original images can be very big so use this - // parameter with - // caution. + // uploaded in. + // The filesize of original images can be very big so use this + // parameter with + // caution. } /* @@ -199,8 +198,8 @@ public void getAuthUrl(TwitterSignIn.GetAuthUrlCallback callback) { } public void getOAuthAccessToken(RequestToken requestToken, - String oauthVerifier, - TwitterSignIn.GetOAuthAccessTokenCallback callback) { + String oauthVerifier, + TwitterSignIn.GetOAuthAccessTokenCallback callback) { mApi.getOAuthAccessToken(requestToken, oauthVerifier, callback); } @@ -216,12 +215,12 @@ public TwitterUser getUser(String screenName) { } public TwitterUser getUser(Long userId, - TwitterFetchUser.FinishedCallback callback) { + TwitterFetchUser.FinishedCallback callback) { return mApi.getUser(userId, callback); } public TwitterUser getUser(String screenName, - TwitterFetchUser.FinishedCallback callback) { + TwitterFetchUser.FinishedCallback callback) { return mApi.getUser(screenName, callback); } @@ -229,12 +228,12 @@ public TwitterUser getUser(String screenName, * */ public TwitterUsers getUsers(TwitterContentHandle contentHandle, - TwitterPaging paging) { + TwitterPaging paging) { return mApi.getUsers(contentHandle, paging); } public TwitterUsers getUsers(TwitterContentHandle contentHandle, - TwitterPaging paging, TwitterFetchUsers.FinishedCallback callback) { + TwitterPaging paging, TwitterFetchUsers.FinishedCallback callback) { return mApi.getUsers(contentHandle, paging, callback); } @@ -255,8 +254,8 @@ public TwitterDirectMessages getDirectMessages( } public void sendDirectMessage(long userId, String recipientScreenName, - String statusText, TwitterContentHandle contentHandle, - TwitterFetchDirectMessagesFinishedCallback callback) { + String statusText, TwitterContentHandle contentHandle, + TwitterFetchDirectMessagesFinishedCallback callback) { mApi.sendDirectMessage(userId, recipientScreenName, statusText, contentHandle, callback); } @@ -265,32 +264,33 @@ public void sendDirectMessage(long userId, String recipientScreenName, * */ public void updateFriendship(String currentUserScreenName, - TwitterUser userToUpdate, boolean create, - TwitterFetchUsers.FinishedCallback callback) { + TwitterUser userToUpdate, boolean create, + TwitterFetchUsers.FinishedCallback callback) { mApi.updateFriendship(currentUserScreenName, userToUpdate, create, callback); } + public void updateFriendshipUserIds(long currentUserId, - ArrayList userIdsToUpdate, boolean create, - TwitterFetchUsers.FinishedCallback callback) { + ArrayList userIdsToUpdate, boolean create, + TwitterFetchUsers.FinishedCallback callback) { mApi.updateFriendshipUserIds(currentUserId, userIdsToUpdate, create, callback); } public void createBlock(long currentUserId, ArrayList userIds, - TwitterFetchUsers.FinishedCallback callback) { + TwitterFetchUsers.FinishedCallback callback) { mApi.createBlock(currentUserId, userIds, callback); } public void reportSpam(long currentUserId, ArrayList userIds, - TwitterFetchUsers.FinishedCallback callback) { + TwitterFetchUsers.FinishedCallback callback) { mApi.reportSpam(currentUserId, userIds, callback); } public TwitterLists getLists(String screenName, - TwitterFetchLists.FinishedCallback callback) { + TwitterFetchLists.FinishedCallback callback) { return mApi.getLists(screenName, callback); } @@ -298,7 +298,7 @@ public TwitterLists getLists(String screenName, * */ public TwitterStatus getStatus(long statusId, - TwitterFetchStatus.FinishedCallback callback) { + TwitterFetchStatus.FinishedCallback callback) { return mApi.getStatus(statusId, callback); } @@ -306,7 +306,7 @@ public TwitterStatus getStatus(long statusId, * */ public void setStatus(TwitterStatusUpdate statusUpdate, - TwitterFetchStatus.FinishedCallback callback) { + TwitterFetchStatus.FinishedCallback callback) { mApi.setStatus(statusUpdate, callback); } @@ -314,7 +314,7 @@ public void setStatus(TwitterStatusUpdate statusUpdate, * */ public void setRetweet(long statusId, - TwitterFetchStatus.FinishedCallback callback) { + TwitterFetchStatus.FinishedCallback callback) { mApi.setRetweet(statusId, callback); } @@ -322,12 +322,12 @@ public void setRetweet(long statusId, * */ public void setFavorite(TwitterStatus status, boolean isFavorite, - TwitterModifyStatuses.FinishedCallback callback) { + TwitterModifyStatuses.FinishedCallback callback) { mApi.setFavorite(status, isFavorite, callback); } public void setFavorite(TwitterStatuses statuses, boolean isFavorite, - TwitterModifyStatuses.FinishedCallback callback) { + TwitterModifyStatuses.FinishedCallback callback) { mApi.setFavorite(statuses, isFavorite, callback); } @@ -340,8 +340,8 @@ public void deleteTweet(TwitterStatuses statuses, TwitterModifyStatuses.Finished * */ public void triggerFetchStatuses(TwitterContentHandle contentHandle, - TwitterPaging paging, - TwitterFetchStatusesFinishedCallback callback, int priorityOffset) { + TwitterPaging paging, + TwitterFetchStatusesFinishedCallback callback, int priorityOffset) { mApi.triggerFetchStatuses(contentHandle, paging, callback, priorityOffset); } @@ -350,8 +350,8 @@ public void triggerFetchStatuses(TwitterContentHandle contentHandle, * */ public void getFriendshipExists(String userScreenName, - String userScreenNameToCheck, - TwitterFetchBooleans.FinishedCallback callback) { + String userScreenNameToCheck, + TwitterFetchBooleans.FinishedCallback callback) { mApi.getFriendshipExists(userScreenName, userScreenNameToCheck, callback); } diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterModifyStatuses.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterModifyStatuses.java index bf1302dc..fd46d7d9 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterModifyStatuses.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterModifyStatuses.java @@ -17,17 +17,19 @@ package org.tweetalib.android; import android.util.Log; + import org.appdotnet4j.model.AdnPost; import org.asynctasktex.AsyncTaskEx; import org.socialnetlib.android.AppdotnetApi; import org.tweetalib.android.TwitterConstant.StatusesType; import org.tweetalib.android.model.TwitterStatus; import org.tweetalib.android.model.TwitterStatuses; -import twitter4j.Twitter; -import twitter4j.TwitterException; import java.util.HashMap; +import twitter4j.Twitter; +import twitter4j.TwitterException; + public class TwitterModifyStatuses { private ModifyStatusesWorkerCallbacks mCallbacks; @@ -49,6 +51,7 @@ public void clearCallbacks() { public interface ModifyStatusesWorkerCallbacks { public Twitter getTwitterInstance(); + public AppdotnetApi getAppdotnetApi(); } @@ -109,7 +112,7 @@ public TwitterModifyStatuses() { } /* - * + * */ public void setWorkerCallbacks(ModifyStatusesWorkerCallbacks callbacks) { mCallbacks = callbacks; @@ -188,7 +191,7 @@ AppdotnetApi getAppdotnetApi() { class ModifyStatusesTaskInput { public ModifyStatusesTaskInput(Integer callbackHandle, StatusesType statusesType, TwitterStatuses statuses, - Integer value) { + Integer value) { mCallbackHandle = callbackHandle; mStatusesType = statusesType; mStatuses = new TwitterStatuses(statuses); @@ -207,7 +210,7 @@ public ModifyStatusesTaskInput(Integer callbackHandle, StatusesType statusesType class ModifyStatusesTaskOutput { ModifyStatusesTaskOutput(TwitterFetchResult result, Integer callbackHandle, TwitterStatuses feed, - Integer outputValue) { + Integer outputValue) { mCallbackHandle = callbackHandle; mFeed = feed; mValue = outputValue; @@ -236,49 +239,14 @@ protected ModifyStatusesTaskOutput doInBackground(ModifyStatusesTaskInput... inp AppdotnetApi appdotnetApi = getAppdotnetApi(); if (appdotnetApi != null) { switch (input.mStatusesType) { - case DELETE: { - if (input.mStatuses != null) { - for (int i = 0; i < input.mStatuses.getStatusCount(); i++) { - TwitterStatus twitterStatus = input.mStatuses.getStatus(i); - AdnPost post = appdotnetApi.deleteTweet(twitterStatus.mId); - if (post == null) { - errorDescription = "Unable to delete status"; - } - } - } - break; - } - - case SET_FAVORITE: { - boolean favorite = input.mValue == 1; - - if (input.mStatuses != null) { - for (int i = 0; i < input.mStatuses.getStatusCount(); i++) { - TwitterStatus twitterStatus = input.mStatuses.getStatus(i); - if (twitterStatus.mIsFavorited != favorite) { - AdnPost post = appdotnetApi.setAdnFavorite(twitterStatus.mId, favorite); - - if (post != null) { - twitterStatus = new TwitterStatus(post); - twitterStatus.setFavorite(favorite); - contentFeed.add(twitterStatus); - } - } - } - } - break; - } - } - } - else if (twitter != null) { - - try { - switch (input.mStatusesType) { case DELETE: { if (input.mStatuses != null) { for (int i = 0; i < input.mStatuses.getStatusCount(); i++) { TwitterStatus twitterStatus = input.mStatuses.getStatus(i); - twitter.destroyStatus(twitterStatus.mId); + AdnPost post = appdotnetApi.deleteTweet(twitterStatus.mId); + if (post == null) { + errorDescription = "Unable to delete status"; + } } } break; @@ -291,34 +259,68 @@ else if (twitter != null) { for (int i = 0; i < input.mStatuses.getStatusCount(); i++) { TwitterStatus twitterStatus = input.mStatuses.getStatus(i); if (twitterStatus.mIsFavorited != favorite) { - try { - twitter4j.Status status; - if (favorite) { - status = twitter.createFavorite(twitterStatus.mId); - } else { - status = twitter.destroyFavorite(twitterStatus.mId); - } + AdnPost post = appdotnetApi.setAdnFavorite(twitterStatus.mId, favorite); - // Yuck: See the comment for - // TwitterStatus.setFavorite() for - // reasons for this - twitterStatus = new TwitterStatus(status); + if (post != null) { + twitterStatus = new TwitterStatus(post); twitterStatus.setFavorite(favorite); - contentFeed.add(twitterStatus); - } catch (TwitterException e) { - // we might get errors setting the favorite - // state to the same - // value again. - // Just ignore those ones... } } } - } - break; } + } + } else if (twitter != null) { + + try { + switch (input.mStatusesType) { + case DELETE: { + if (input.mStatuses != null) { + for (int i = 0; i < input.mStatuses.getStatusCount(); i++) { + TwitterStatus twitterStatus = input.mStatuses.getStatus(i); + twitter.destroyStatus(twitterStatus.mId); + } + } + break; + } + + case SET_FAVORITE: { + boolean favorite = input.mValue == 1; + + if (input.mStatuses != null) { + for (int i = 0; i < input.mStatuses.getStatusCount(); i++) { + TwitterStatus twitterStatus = input.mStatuses.getStatus(i); + if (twitterStatus.mIsFavorited != favorite) { + try { + twitter4j.Status status; + if (favorite) { + status = twitter.createFavorite(twitterStatus.mId); + } else { + status = twitter.destroyFavorite(twitterStatus.mId); + } + + // Yuck: See the comment for + // TwitterStatus.setFavorite() for + // reasons for this + twitterStatus = new TwitterStatus(status); + twitterStatus.setFavorite(favorite); + + contentFeed.add(twitterStatus); + } catch (TwitterException e) { + // we might get errors setting the favorite + // state to the same + // value again. + // Just ignore those ones... + } + } + } + + } + + break; + } } } catch (TwitterException e) { e.printStackTrace(); diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterPaging.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterPaging.java index 5dd07d98..38f35aef 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterPaging.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterPaging.java @@ -17,7 +17,9 @@ package org.tweetalib.android; import android.util.Log; + import org.appdotnet4j.model.AdnPaging; + import twitter4j.Paging; public class TwitterPaging { diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterSignIn.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterSignIn.java index 49be3c04..b437d794 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterSignIn.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterSignIn.java @@ -16,11 +16,11 @@ package org.tweetalib.android; -import java.util.HashMap; - import org.asynctasktex.AsyncTaskEx; - import org.socialnetlib.android.SocialNetConstant; +import org.tweetalib.android.model.TwitterUser; + +import java.util.HashMap; import twitter4j.Twitter; import twitter4j.TwitterException; @@ -28,8 +28,6 @@ import twitter4j.auth.AccessToken; import twitter4j.auth.RequestToken; -import org.tweetalib.android.model.TwitterUser; - public class TwitterSignIn { private SignInWorkerCallbacks mCallbacks; @@ -40,7 +38,7 @@ public class TwitterSignIn { /* - * + * */ public interface SignInWorkerCallbacks { @@ -51,7 +49,7 @@ public interface SignInWorkerCallbacks { public String getConsumerSecret(); public TwitterUser verifyCredentials(String accessToken, - String accessTokenSecret); + String accessTokenSecret); } /* @@ -68,7 +66,7 @@ public void setWorkerCallbacks(SignInWorkerCallbacks callbacks) { public interface GetAuthUrlCallbackInterface { public void finished(boolean successful, String url, - RequestToken requestToken); + RequestToken requestToken); } @@ -93,7 +91,7 @@ public GetAuthUrlCallback() { public interface GetOAuthAccessTokenCallbackInterface { public void finished(boolean successful, TwitterUser user, - String accessToken, String accessTokenSecret); + String accessToken, String accessTokenSecret); } @@ -172,7 +170,7 @@ public void getAuthUrl(GetAuthUrlCallback callback) { mGetAuthUrlCallbackMap.put(mGetAuthUrlCallbackHandle, callback); new FetchAuthUrlTask().execute(AsyncTaskEx.PRIORITY_HIGHEST, "Get Auth URL", new FetchAuthUrlTaskInput( - mGetAuthUrlCallbackHandle)); + mGetAuthUrlCallbackHandle)); mGetAuthUrlCallbackHandle += 1; } @@ -181,7 +179,7 @@ public void getAuthUrl(GetAuthUrlCallback callback) { * */ public void getOAuthAccessToken(RequestToken requestToken, - String oauthVerifier, GetOAuthAccessTokenCallback callback) { + String oauthVerifier, GetOAuthAccessTokenCallback callback) { assert (!mGetOAuthAccessTokenCallbackMap.containsValue(callback)); @@ -189,8 +187,8 @@ public void getOAuthAccessToken(RequestToken requestToken, callback); new FetchOAuthAccessTokenTask().execute(AsyncTaskEx.PRIORITY_HIGHEST, "Get OAuth AccessToken", new FetchOAuthAccessTokenTaskInput( - requestToken, oauthVerifier, - mGetOAuthAccessTokenCallbackHandle)); + requestToken, oauthVerifier, + mGetOAuthAccessTokenCallbackHandle)); mGetOAuthAccessTokenCallbackHandle += 1; } @@ -213,7 +211,7 @@ class FetchAuthUrlTaskInput { class FetchAuthUrlTaskOutput { FetchAuthUrlTaskOutput(Integer callbackHandle, - RequestToken requestToken, String url) { + RequestToken requestToken, String url) { mCallbackHandle = callbackHandle; mRequestToken = requestToken; mUrl = url; @@ -274,7 +272,7 @@ protected void onPostExecute(FetchAuthUrlTaskOutput output) { class FetchOAuthAccessTokenTaskInput { FetchOAuthAccessTokenTaskInput(RequestToken requestToken, - String oauthVerifier, Integer callbackHandle) { + String oauthVerifier, Integer callbackHandle) { mRequestToken = requestToken; mOAuthVerifier = oauthVerifier; @@ -292,7 +290,7 @@ class FetchOAuthAccessTokenTaskInput { class FetchOAuthAccessTokenTaskOutput { FetchOAuthAccessTokenTaskOutput(TwitterUser user, String accessToken, - String accessTokenSecret, Integer callbackHandle) { + String accessTokenSecret, Integer callbackHandle) { mUser = user; mAccessToken = accessToken; @@ -324,19 +322,19 @@ protected FetchOAuthAccessTokenTaskOutput doInBackground( String accessTokenSecret = null; switch (mCallbacks.getType()) { - case Twitter: - Twitter twitter = new TwitterFactory().getInstance(); - twitter.setOAuthConsumer(mCallbacks.getConsumerKey(), - mCallbacks.getConsumerSecret()); - AccessToken at = twitter.getOAuthAccessToken( - input.mRequestToken, input.mOAuthVerifier); - accessToken = at.getToken(); - accessTokenSecret = at.getTokenSecret(); - break; - - case Appdotnet: - accessToken = input.mOAuthVerifier; - break; + case Twitter: + Twitter twitter = new TwitterFactory().getInstance(); + twitter.setOAuthConsumer(mCallbacks.getConsumerKey(), + mCallbacks.getConsumerSecret()); + AccessToken at = twitter.getOAuthAccessToken( + input.mRequestToken, input.mOAuthVerifier); + accessToken = at.getToken(); + accessTokenSecret = at.getTokenSecret(); + break; + + case Appdotnet: + accessToken = input.mOAuthVerifier; + break; } TwitterUser user = mCallbacks.verifyCredentials(accessToken, @@ -344,11 +342,9 @@ protected FetchOAuthAccessTokenTaskOutput doInBackground( return new FetchOAuthAccessTokenTaskOutput(user, accessToken, accessTokenSecret, input.mCallbackHandle); - } - catch (NullPointerException e) { + } catch (NullPointerException e) { e.printStackTrace(); - } - catch (TwitterException e) { + } catch (TwitterException e) { e.printStackTrace(); } diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterUtil.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterUtil.java index 98e3fa4d..10474178 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterUtil.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterUtil.java @@ -16,14 +16,15 @@ package org.tweetalib.android; +import com.twitter.Autolink; + +import org.appdotnet4j.model.AdnPost; + import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; -import java.util.Map; -import org.appdotnet4j.model.AdnPost; -import org.tweetalib.android.model.TwitterMediaEntity; import twitter4j.MediaEntity; import twitter4j.Paging; import twitter4j.Query; @@ -31,8 +32,6 @@ import twitter4j.URLEntity; import twitter4j.UserMentionEntity; -import com.twitter.Autolink; - public class TwitterUtil { private static Autolink mAutoLink; @@ -45,7 +44,7 @@ private static void initCommon() { } /* - * + * */ public static String stripMarkup(String text) { return text != null ? android.text.Html.fromHtml(text).toString() @@ -61,7 +60,7 @@ public static String getTextMarkup(String text, URLEntity[] urlEntities) { * visible links */ public static String getStatusMarkup(Status status) { - return getStatusMarkup(status.getText(),status.getMediaEntities(), status.getURLEntities()); + return getStatusMarkup(status.getText(), status.getMediaEntities(), status.getURLEntities()); } /* @@ -76,7 +75,7 @@ public static String getStatusMarkup(AdnPost post) { * */ public static String getStatusMarkup(String statusText, MediaEntity[] mediaEntities, - URLEntity[] urlEntities) { + URLEntity[] urlEntities) { initCommon(); diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/callback/TwitterFetchDirectMessagesFinishedCallbackInterface.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/callback/TwitterFetchDirectMessagesFinishedCallbackInterface.java index 3d2d0527..0a0a57ac 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/callback/TwitterFetchDirectMessagesFinishedCallbackInterface.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/callback/TwitterFetchDirectMessagesFinishedCallbackInterface.java @@ -23,6 +23,6 @@ public interface TwitterFetchDirectMessagesFinishedCallbackInterface { public void finished(TwitterContentHandle contentHandle, TwitterFetchResult result, - TwitterDirectMessages messages); + TwitterDirectMessages messages); } diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/fetch/TwitterFetchDirectMessages.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/fetch/TwitterFetchDirectMessages.java index 876ff541..2d18fc38 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/fetch/TwitterFetchDirectMessages.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/fetch/TwitterFetchDirectMessages.java @@ -44,10 +44,10 @@ public class TwitterFetchDirectMessages { private final HashMap mFinishedCallbackMap; /* - * + * */ public void clearCallbacks() { - if (mFinishedCallbackMap != null ) { + if (mFinishedCallbackMap != null) { mFinishedCallbackMap.clear(); } } @@ -149,8 +149,8 @@ public TwitterDirectMessages getDirectMessages( mFinishedCallbackMap.put(mFetchMessagesCallbackHandle, callback); new FetchStatusesTask().execute(AsyncTaskEx.PRIORITY_HIGH, "Fetch DMs", new FetchDirectMessagesTaskInput( - mFetchMessagesCallbackHandle, contentHandle, paging, - connectionStatus)); + mFetchMessagesCallbackHandle, contentHandle, paging, + connectionStatus)); mFetchMessagesCallbackHandle += 1; return null; @@ -160,10 +160,10 @@ public TwitterDirectMessages getDirectMessages( * */ public void sendDirectMessage(long userId, String recipientScreenName, - String statusText, - TwitterContentHandle contentHandle, - TwitterFetchDirectMessagesFinishedCallback callback, - ConnectionStatus connectionStatus) { + String statusText, + TwitterContentHandle contentHandle, + TwitterFetchDirectMessagesFinishedCallback callback, + ConnectionStatus connectionStatus) { if (connectionStatus != null && !connectionStatus.isOnline()) { if (callback != null) { callback.finished(contentHandle, new TwitterFetchResult(false, @@ -174,8 +174,8 @@ public void sendDirectMessage(long userId, String recipientScreenName, mFinishedCallbackMap.put(mFetchMessagesCallbackHandle, callback); new FetchStatusesTask().execute(AsyncTaskEx.PRIORITY_HIGH, "Fetch DMs", new FetchDirectMessagesTaskInput( - mFetchMessagesCallbackHandle, userId, - recipientScreenName, statusText, connectionStatus)); + mFetchMessagesCallbackHandle, userId, + recipientScreenName, statusText, connectionStatus)); mFetchMessagesCallbackHandle += 1; } @@ -193,8 +193,8 @@ public void cancel(TwitterFetchDirectMessagesFinishedCallback callback) { class FetchDirectMessagesTaskInput { FetchDirectMessagesTaskInput(Integer callbackHandle, - TwitterContentHandle contentHandle, TwitterPaging paging, - ConnectionStatus connectionStatus) { + TwitterContentHandle contentHandle, TwitterPaging paging, + ConnectionStatus connectionStatus) { mCallbackHandle = callbackHandle; mContentHandle = contentHandle; mPaging = paging; @@ -202,8 +202,8 @@ class FetchDirectMessagesTaskInput { } FetchDirectMessagesTaskInput(Integer callbackHandle, Long userId, - String recipientScreenName, String statusText, - ConnectionStatus connectionStatus) { + String recipientScreenName, String statusText, + ConnectionStatus connectionStatus) { mCallbackHandle = callbackHandle; mUserId = userId; mRecipientScreenName = recipientScreenName; @@ -226,7 +226,7 @@ class FetchDirectMessagesTaskInput { class FetchDirectMessagesTaskOutput { FetchDirectMessagesTaskOutput(TwitterContentHandle contentHandle, TwitterFetchResult result, - Integer callbackHandle, TwitterDirectMessages messages) { + Integer callbackHandle, TwitterDirectMessages messages) { mContentHandle = contentHandle; mResult = result; mCallbackHandle = callbackHandle; @@ -287,33 +287,33 @@ protected FetchDirectMessagesTaskOutput doInBackground( } switch (input.mContentHandle.getDirectMessagesType()) { - case ALL_MESSAGES: { - messages = getDirectMessages(input.mContentHandle); - // Annoyingly, DMs can't be retrieved in a threaded - // format. Handle this - // by getting sent and received and managing - // ourselves... - Log.d("api-call", "getDirectMessages"); - ResponseList receivedDirectMessages = twitter - .getDirectMessages(paging); - Log.d("api-call", "getSendDirectMessages"); - ResponseList sentDirectMessages = twitter - .getSentDirectMessages(paging); - - AddUserCallback addUserCallback = new AddUserCallback() { - - @Override - public void addUser(User user) { - mCallbacks.addUser(user); - } - }; - - messages.add(sentDirectMessages, - receivedDirectMessages, addUserCallback); - break; - } - default: - break; + case ALL_MESSAGES: { + messages = getDirectMessages(input.mContentHandle); + // Annoyingly, DMs can't be retrieved in a threaded + // format. Handle this + // by getting sent and received and managing + // ourselves... + Log.d("api-call", "getDirectMessages"); + ResponseList receivedDirectMessages = twitter + .getDirectMessages(paging); + Log.d("api-call", "getSendDirectMessages"); + ResponseList sentDirectMessages = twitter + .getSentDirectMessages(paging); + + AddUserCallback addUserCallback = new AddUserCallback() { + + @Override + public void addUser(User user) { + mCallbacks.addUser(user); + } + }; + + messages.add(sentDirectMessages, + receivedDirectMessages, addUserCallback); + break; + } + default: + break; } } diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/fetch/TwitterFetchStatuses.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/fetch/TwitterFetchStatuses.java index 0655a173..20209c55 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/fetch/TwitterFetchStatuses.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/fetch/TwitterFetchStatuses.java @@ -54,7 +54,7 @@ public class TwitterFetchStatuses { * */ public void clearCallbacks() { - if (mFinishedCallbackMap != null ) { + if (mFinishedCallbackMap != null) { for (Integer key : mFinishedCallbackMap.keySet()) { TwitterFetchStatusesFinishedCallback callback = mFinishedCallbackMap.get(key); cancel(callback); @@ -126,7 +126,7 @@ AppdotnetApi getAppdotnetApi() { } /* - * + * */ TwitterStatuses setStatuses(TwitterContentHandle contentHandle, QueryResult result) { TwitterStatuses feed = getStatuses(contentHandle); @@ -222,7 +222,7 @@ public TwitterStatuses getStatuses(TwitterContentHandle handle) { * */ public void trigger(TwitterContentHandle contentHandle, TwitterPaging paging, - TwitterFetchStatusesFinishedCallback callback, ConnectionStatus connectionStatus, int priorityOffset) { + TwitterFetchStatusesFinishedCallback callback, ConnectionStatus connectionStatus, int priorityOffset) { if (connectionStatus != null && !connectionStatus.isOnline()) { if (callback != null) { @@ -257,7 +257,7 @@ public void cancel(TwitterFetchStatusesFinishedCallback callback) { class FetchStatusesTaskInput { FetchStatusesTaskInput(Integer callbackHandle, TwitterContentHandle contentHandle, TwitterPaging paging, - ConnectionStatus connectionStatus) { + ConnectionStatus connectionStatus) { mCallbackHandle = callbackHandle; mContentHandle = contentHandle; mPaging = paging; @@ -276,7 +276,7 @@ class FetchStatusesTaskInput { class FetchStatusesTaskOutput { FetchStatusesTaskOutput(TwitterFetchResult result, Integer callbackHandle, TwitterStatuses feed, - TwitterContentHandle contentHandle) { + TwitterContentHandle contentHandle) { mResult = result; mCallbackHandle = callbackHandle; mContentHandle = contentHandle; @@ -322,122 +322,122 @@ protected FetchStatusesTaskOutput doInBackground(FetchStatusesTaskInput... input } switch (input.mContentHandle.getStatusesType()) { - case USER_HOME_TIMELINE: { - AdnPosts posts = appdotnetApi.getAdnStream(paging); - contentFeed = setStatuses(input.mContentHandle, posts); - break; - } - - case USER_TIMELINE: { - String userIdAsString = input.mContentHandle.getIdentifier(); - try { - int userId = Integer.valueOf(userIdAsString); - AdnPosts posts = appdotnetApi.getAdnUserStream(userId, paging); + case USER_HOME_TIMELINE: { + AdnPosts posts = appdotnetApi.getAdnStream(paging); contentFeed = setStatuses(input.mContentHandle, posts); - } catch (NumberFormatException e) { + break; } - break; - } - case RETWEETS_OF_ME: { - AdnInteractions interactions = appdotnetApi.getAdnInteractions(); - AdnPosts posts = null; - if (interactions != null) { - posts = interactions.getAsPosts(); + case USER_TIMELINE: { + String userIdAsString = input.mContentHandle.getIdentifier(); + try { + int userId = Integer.valueOf(userIdAsString); + AdnPosts posts = appdotnetApi.getAdnUserStream(userId, paging); + contentFeed = setStatuses(input.mContentHandle, posts); + } catch (NumberFormatException e) { + } + break; } - contentFeed = setStatuses(input.mContentHandle, posts); - break; - } - case SCREEN_NAME_SEARCH: - case USER_MENTIONS: { - String userIdAsString = input.mContentHandle.getIdentifier(); - try { - int userId = Integer.valueOf(userIdAsString); - AdnPosts posts = appdotnetApi.getAdnMentions(userId, paging); + case RETWEETS_OF_ME: { + AdnInteractions interactions = appdotnetApi.getAdnInteractions(); + AdnPosts posts = null; + if (interactions != null) { + posts = interactions.getAsPosts(); + } contentFeed = setStatuses(input.mContentHandle, posts); - } catch (NumberFormatException e) { + break; } - break; - } - case USER_FAVORITES: { - String userIdAsString = input.mContentHandle.getIdentifier(); - AdnPosts posts = appdotnetApi.getAdnFavorites(userIdAsString, paging); - contentFeed = setStatuses(input.mContentHandle, posts); - break; - } + case SCREEN_NAME_SEARCH: + case USER_MENTIONS: { + String userIdAsString = input.mContentHandle.getIdentifier(); + try { + int userId = Integer.valueOf(userIdAsString); + AdnPosts posts = appdotnetApi.getAdnMentions(userId, paging); + contentFeed = setStatuses(input.mContentHandle, posts); + } catch (NumberFormatException e) { + } + break; + } - case STATUS_SEARCH: { - String searchTerm = input.mContentHandle.getScreenName(); - if (searchTerm.length() > 1 && searchTerm.charAt(0) == '#') { - searchTerm = searchTerm.substring(1); + case USER_FAVORITES: { + String userIdAsString = input.mContentHandle.getIdentifier(); + AdnPosts posts = appdotnetApi.getAdnFavorites(userIdAsString, paging); + contentFeed = setStatuses(input.mContentHandle, posts); + break; } - AdnPosts posts = appdotnetApi.getAdnTagPosts(searchTerm, paging); - contentFeed = setStatuses(input.mContentHandle, posts); - break; - } - case GLOBAL_FEED: { - AdnPosts posts = appdotnetApi.getAdnGlobalStream(paging); - contentFeed = setStatuses(input.mContentHandle, posts); - break; - } + case STATUS_SEARCH: { + String searchTerm = input.mContentHandle.getScreenName(); + if (searchTerm.length() > 1 && searchTerm.charAt(0) == '#') { + searchTerm = searchTerm.substring(1); + } + AdnPosts posts = appdotnetApi.getAdnTagPosts(searchTerm, paging); + contentFeed = setStatuses(input.mContentHandle, posts); + break; + } + + case GLOBAL_FEED: { + AdnPosts posts = appdotnetApi.getAdnGlobalStream(paging); + contentFeed = setStatuses(input.mContentHandle, posts); + break; + } - case PREVIOUS_CONVERSATION: { - TwitterStatuses statuses = new TwitterStatuses(); - long statusId = Long.parseLong(input.mContentHandle.getIdentifier()); - AdnPost post = appdotnetApi.getAdnPost(statusId); - if (post != null) { - TwitterStatus status = new TwitterStatus(post); - if (status.mInReplyToStatusId != null) { - long inReplyToStatusId = status.mInReplyToStatusId; - for (int i = 0; i < 4; i++) { - TwitterStatus reply = new TwitterStatus(appdotnetApi.getAdnPost(inReplyToStatusId)); - statuses.add(reply, false); - if (reply.mInReplyToStatusId != null) { - inReplyToStatusId = reply.mInReplyToStatusId; - } else { - break; + case PREVIOUS_CONVERSATION: { + TwitterStatuses statuses = new TwitterStatuses(); + long statusId = Long.parseLong(input.mContentHandle.getIdentifier()); + AdnPost post = appdotnetApi.getAdnPost(statusId); + if (post != null) { + TwitterStatus status = new TwitterStatus(post); + if (status.mInReplyToStatusId != null) { + long inReplyToStatusId = status.mInReplyToStatusId; + for (int i = 0; i < 4; i++) { + TwitterStatus reply = new TwitterStatus(appdotnetApi.getAdnPost(inReplyToStatusId)); + statuses.add(reply, false); + if (reply.mInReplyToStatusId != null) { + inReplyToStatusId = reply.mInReplyToStatusId; + } else { + break; + } } } - } - statuses.add(status, false); - if (statuses.getStatusCount() > 0) { - statuses.sort(); - contentFeed = setStatuses(input.mContentHandle, statuses, false); + statuses.add(status, false); + if (statuses.getStatusCount() > 0) { + statuses.sort(); + contentFeed = setStatuses(input.mContentHandle, statuses, false); + } } } - } - case FULL_CONVERSATION: { - long statusId = Long.parseLong(input.mContentHandle.getIdentifier()); + case FULL_CONVERSATION: { + long statusId = Long.parseLong(input.mContentHandle.getIdentifier()); - AddUserCallback addUserCallback = new AddUserCallback() { + AddUserCallback addUserCallback = new AddUserCallback() { - @Override - public void addUser(User user) { - mCallbacks.addUser(user); - } + @Override + public void addUser(User user) { + mCallbacks.addUser(user); + } - @Override - public void addUser(AdnUser user) { - mCallbacks.addUser(user); - } - }; + @Override + public void addUser(AdnUser user) { + mCallbacks.addUser(user); + } + }; - AdnPosts conversation = appdotnetApi.getAdnConversation(statusId, paging); - if (conversation != null && conversation.mPosts != null && conversation.mPosts.size() > 0) { - TwitterStatuses statuses = new TwitterStatuses(); - statuses.add(conversation, addUserCallback); - contentFeed = setStatuses(input.mContentHandle, statuses, true); + AdnPosts conversation = appdotnetApi.getAdnConversation(statusId, paging); + if (conversation != null && conversation.mPosts != null && conversation.mPosts.size() > 0) { + TwitterStatuses statuses = new TwitterStatuses(); + statuses.add(conversation, addUserCallback); + contentFeed = setStatuses(input.mContentHandle, statuses, true); + } } - } - break; - - default: break; + + default: + break; } } else { @@ -455,107 +455,107 @@ public void addUser(AdnUser user) { try { switch (input.mContentHandle.getStatusesType()) { - case USER_HOME_TIMELINE: { - Log.d("api-call", "getHomeTimeline"); - ResponseList statuses; - statuses = twitter.getHomeTimeline(paging); - contentFeed = setStatuses(input.mContentHandle, statuses); - break; - } - - case USER_TIMELINE: { - Log.d("api-call", "getUserTimeline"); - ResponseList statuses = - twitter.getUserTimeline(input.mContentHandle.getScreenName(), paging); - contentFeed = setStatuses(input.mContentHandle, statuses); - break; - } + case USER_HOME_TIMELINE: { + Log.d("api-call", "getHomeTimeline"); + ResponseList statuses; + statuses = twitter.getHomeTimeline(paging); + contentFeed = setStatuses(input.mContentHandle, statuses); + break; + } - case USER_MENTIONS: { - Log.d("api-call", "getMentionsTimeline"); - ResponseList statuses = twitter.getMentionsTimeline(paging); - contentFeed = setStatuses(input.mContentHandle, statuses); - break; - } + case USER_TIMELINE: { + Log.d("api-call", "getUserTimeline"); + ResponseList statuses = + twitter.getUserTimeline(input.mContentHandle.getScreenName(), paging); + contentFeed = setStatuses(input.mContentHandle, statuses); + break; + } - case USER_LIST_TIMELINE: { - String listIdAsString = input.mContentHandle.getIdentifier(); - try { - Log.d("api-call", "getUserListStatuses"); - int listId = Integer.valueOf(listIdAsString); - ResponseList statuses = twitter.getUserListStatuses(listId, paging); + case USER_MENTIONS: { + Log.d("api-call", "getMentionsTimeline"); + ResponseList statuses = twitter.getMentionsTimeline(paging); contentFeed = setStatuses(input.mContentHandle, statuses); - } catch (NumberFormatException e) { + break; } - break; - } - case USER_FAVORITES: { - Log.d("api-call", "getFavorites"); - ResponseList statuses = - twitter.getFavorites(input.mContentHandle.getScreenName(), paging); - contentFeed = setStatuses(input.mContentHandle, statuses); - break; - } + case USER_LIST_TIMELINE: { + String listIdAsString = input.mContentHandle.getIdentifier(); + try { + Log.d("api-call", "getUserListStatuses"); + int listId = Integer.valueOf(listIdAsString); + ResponseList statuses = twitter.getUserListStatuses(listId, paging); + contentFeed = setStatuses(input.mContentHandle, statuses); + } catch (NumberFormatException e) { + } + break; + } - case RETWEETS_OF_ME: { - Log.d("api-call", "getRetweetsOfMe"); - ResponseList statuses = twitter.getRetweetsOfMe(paging); - contentFeed = setStatuses(input.mContentHandle, statuses); - break; - } + case USER_FAVORITES: { + Log.d("api-call", "getFavorites"); + ResponseList statuses = + twitter.getFavorites(input.mContentHandle.getScreenName(), paging); + contentFeed = setStatuses(input.mContentHandle, statuses); + break; + } - case SCREEN_NAME_SEARCH: { - Log.d("api-call", "search"); - Query query = new Query("@" + input.mContentHandle.getScreenName()); - query = TwitterUtil.updateQueryWithPaging(query, paging); - QueryResult result = twitter.search(query); - contentFeed = setStatuses(input.mContentHandle, result); - break; - } + case RETWEETS_OF_ME: { + Log.d("api-call", "getRetweetsOfMe"); + ResponseList statuses = twitter.getRetweetsOfMe(paging); + contentFeed = setStatuses(input.mContentHandle, statuses); + break; + } - case STATUS_SEARCH: { - Log.d("api-call", "search"); - Query query = new Query(input.mContentHandle.getScreenName()); - query = TwitterUtil.updateQueryWithPaging(query, paging); - QueryResult result = twitter.search(query); - contentFeed = setStatuses(input.mContentHandle, result); - break; - } + case SCREEN_NAME_SEARCH: { + Log.d("api-call", "search"); + Query query = new Query("@" + input.mContentHandle.getScreenName()); + query = TwitterUtil.updateQueryWithPaging(query, paging); + QueryResult result = twitter.search(query); + contentFeed = setStatuses(input.mContentHandle, result); + break; + } + case STATUS_SEARCH: { + Log.d("api-call", "search"); + Query query = new Query(input.mContentHandle.getScreenName()); + query = TwitterUtil.updateQueryWithPaging(query, paging); + QueryResult result = twitter.search(query); + contentFeed = setStatuses(input.mContentHandle, result); + break; + } - case PREVIOUS_CONVERSATION: - case FULL_CONVERSATION: { - Log.d("api-call", "showStatus"); - TwitterStatuses statuses = new TwitterStatuses(); - long statusId = Long.parseLong(input.mContentHandle.getIdentifier()); - TwitterStatus status = new TwitterStatus(twitter.showStatus(statusId)); - if (status.mInReplyToStatusId != null) { - long inReplyToStatusId = status.mInReplyToStatusId; - for (int i = 0; i < 4; i++) { - Log.d("api-call", "showStatus"); - TwitterStatus reply = new TwitterStatus(twitter.showStatus(inReplyToStatusId)); - statuses.add(reply, false); - if (reply.mInReplyToStatusId != null) { - inReplyToStatusId = reply.mInReplyToStatusId; - } else { - break; + + case PREVIOUS_CONVERSATION: + case FULL_CONVERSATION: { + Log.d("api-call", "showStatus"); + TwitterStatuses statuses = new TwitterStatuses(); + long statusId = Long.parseLong(input.mContentHandle.getIdentifier()); + TwitterStatus status = new TwitterStatus(twitter.showStatus(statusId)); + if (status.mInReplyToStatusId != null) { + long inReplyToStatusId = status.mInReplyToStatusId; + for (int i = 0; i < 4; i++) { + Log.d("api-call", "showStatus"); + TwitterStatus reply = new TwitterStatus(twitter.showStatus(inReplyToStatusId)); + statuses.add(reply, false); + if (reply.mInReplyToStatusId != null) { + inReplyToStatusId = reply.mInReplyToStatusId; + } else { + break; + } } } - } - statuses.add(status, false); + statuses.add(status, false); - if (statuses.getStatusCount() > 0) { - statuses.sort(); - contentFeed = setStatuses(input.mContentHandle, statuses, true); - } + if (statuses.getStatusCount() > 0) { + statuses.sort(); + contentFeed = setStatuses(input.mContentHandle, statuses, true); + } - break; - } + break; + } - default: - break; + default: + break; } } catch (TwitterException e) { diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterDirectMessage.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterDirectMessage.java index 94f430a7..9ea94810 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterDirectMessage.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterDirectMessage.java @@ -16,19 +16,20 @@ package org.tweetalib.android.model; -import java.util.Date; +import android.text.Html; +import android.text.Spanned; import org.tweetalib.android.TwitterUtil; + +import java.util.Date; + import twitter4j.DirectMessage; import twitter4j.User; -import android.text.Html; -import android.text.Spanned; - public class TwitterDirectMessage implements Comparable { /* - * + * */ public enum MessageType { SENT, RECEIVED @@ -43,7 +44,7 @@ public TwitterDirectMessage(DirectMessage message, User otherUser) { : MessageType.RECEIVED; mText = message.getText(); TwitterMediaEntity mediaEntity = TwitterMediaEntity.createMediaEntity(message); - String descriptionMarkup = TwitterUtil.getStatusMarkup(mText,message.getMediaEntities() ,message.getURLEntities()); + String descriptionMarkup = TwitterUtil.getStatusMarkup(mText, message.getMediaEntities(), message.getURLEntities()); mTextSpanned = Html.fromHtml(descriptionMarkup + " "); mCreatedAt = message.getCreatedAt(); mOtherUserId = otherUser.getId(); @@ -79,13 +80,11 @@ public String getOtherUserScreenName() { return mOtherUserScreenName; } - public TwitterUser getOtherUser() - { + public TwitterUser getOtherUser() { return mOtherUser; } - public TwitterUser getSender() - { + public TwitterUser getSender() { return mSender; } diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterDirectMessages.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterDirectMessages.java index 58070797..e6c6ca32 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterDirectMessages.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterDirectMessages.java @@ -42,7 +42,7 @@ public ArrayList getRawReceivedMessages() { class Conversation implements Comparable { /* - * + * */ public Conversation(Long otherUserId) { mMessages = new ArrayList(); @@ -92,7 +92,7 @@ public int compareTo(Conversation other) { if (thisMostRecent != null && otherMostRecent != null && thisMostRecent.getCreatedAt().before( - otherMostRecent.getCreatedAt())) { + otherMostRecent.getCreatedAt())) { return 1; } return -1; @@ -113,7 +113,7 @@ void removeDuplicates() { if (size != 0) { TwitterDirectMessage previous = null; for (Iterator it = mMessages.iterator(); it - .hasNext();) { + .hasNext(); ) { TwitterDirectMessage current = it.next(); if (previous != null && current.getId() == previous.getId()) { it.remove(); @@ -160,8 +160,8 @@ public TwitterDirectMessages(long messageOwnerId) { * */ public void add(ResponseList sentDirectMessages, - ResponseList receivedDirectMessages, - AddUserCallback addUserCallback) { + ResponseList receivedDirectMessages, + AddUserCallback addUserCallback) { for (int i = 0; i < 2; i++) { diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterDirectMessagesHandle.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterDirectMessagesHandle.java index 89ec63e5..6bc38e99 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterDirectMessagesHandle.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterDirectMessagesHandle.java @@ -19,7 +19,7 @@ public class TwitterDirectMessagesHandle { /* - * + * */ public TwitterDirectMessagesHandle(long userId, Long otherUserId) { mUserId = userId; diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterMediaEntity.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterMediaEntity.java index 3f3a017b..bde47d06 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterMediaEntity.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterMediaEntity.java @@ -16,7 +16,8 @@ package org.tweetalib.android.model; -import org.appdotnet4j.model.AdnPost; +import android.net.Uri; + import org.json.JSONException; import org.json.JSONObject; @@ -25,18 +26,16 @@ import twitter4j.Status; import twitter4j.URLEntity; -import android.net.Uri; - public class TwitterMediaEntity { // https://dev.twitter.com/docs/tweet-entities /* - * + * */ public enum Source { TWITTER, INSTAGRAM, TWITPIC, LOCKERZ, // Note that Plixi and Lockerz use - // the same API, so - // Plixi is treated as Lockerz + // the same API, so + // Plixi is treated as Lockerz YFROG, IMGUR, YOUTUBE, } @@ -69,12 +68,10 @@ public static TwitterMediaEntity createMediaEntity(Status status) { MediaEntity[] mediaEntities; URLEntity[] urlEntities; - if(status.isRetweet()){ + if (status.isRetweet()) { mediaEntities = status.getRetweetedStatus().getMediaEntities(); urlEntities = status.getRetweetedStatus().getURLEntities(); - } - else - { + } else { mediaEntities = status.getMediaEntities(); urlEntities = status.getURLEntities(); } @@ -178,30 +175,30 @@ private static TwitterMediaEntity getTwitterMediaEntityFromUrl( private static String getInstagramMediaUrl(String url) { String lowerCaseUrl = url.toLowerCase(); - if (lowerCaseUrl.indexOf("://instagr.am/p/") > -1 ) { - String instagramMatch = "://instagr.am/p/"; - int startIndex = lowerCaseUrl.indexOf(instagramMatch); - if (startIndex > -1) { - startIndex += instagramMatch.length(); - int endIndex = lowerCaseUrl.indexOf("/", startIndex); - if (endIndex > -1) { - String code = url.substring(startIndex, endIndex); - return "http://instagr.am/p/" + code + "/media/"; - } - } - } - if (lowerCaseUrl.indexOf("://instagram.com/p/") > -1 ) { - String instagramMatch = "://instagram.com/p/"; - int startIndex = lowerCaseUrl.indexOf(instagramMatch); - if (startIndex > -1) { - startIndex += instagramMatch.length(); - int endIndex = lowerCaseUrl.indexOf("/", startIndex); - if (endIndex > -1) { - String code = url.substring(startIndex, endIndex); - return "http://instagram.com/p/" + code + "/media/"; - } - } - } + if (lowerCaseUrl.indexOf("://instagr.am/p/") > -1) { + String instagramMatch = "://instagr.am/p/"; + int startIndex = lowerCaseUrl.indexOf(instagramMatch); + if (startIndex > -1) { + startIndex += instagramMatch.length(); + int endIndex = lowerCaseUrl.indexOf("/", startIndex); + if (endIndex > -1) { + String code = url.substring(startIndex, endIndex); + return "http://instagr.am/p/" + code + "/media/"; + } + } + } + if (lowerCaseUrl.indexOf("://instagram.com/p/") > -1) { + String instagramMatch = "://instagram.com/p/"; + int startIndex = lowerCaseUrl.indexOf(instagramMatch); + if (startIndex > -1) { + startIndex += instagramMatch.length(); + int endIndex = lowerCaseUrl.indexOf("/", startIndex); + if (endIndex > -1) { + String code = url.substring(startIndex, endIndex); + return "http://instagram.com/p/" + code + "/media/"; + } + } + } return null; } @@ -301,7 +298,7 @@ private static String getYouTubeUrl(String url) { * */ private TwitterMediaEntity(Source source, String mediaCode, String url, - String expandedUrl) { + String expandedUrl) { mSource = source; mMediaCode = mediaCode; mUrl = url; @@ -380,98 +377,98 @@ public Source getSource() { public String getMediaUrl(Size size) { switch (mSource) { - case TWITTER: - switch (size) { - case THUMB: - return mMediaCode + ":thumb"; - case SMALL: - return mMediaCode + ":small"; - case MEDIUM: - return mMediaCode + ":medium"; - case LARGE: - return mMediaCode + ":large"; - } - break; - - case INSTAGRAM: - switch (size) { - case THUMB: - return mMediaCode + "?size=t"; - case SMALL: - return mMediaCode + "?size=t"; - case MEDIUM: - return mMediaCode + "?size=m"; - case LARGE: - return mMediaCode + "?size=l"; - } - break; - - case TWITPIC: - switch (size) { - case THUMB: - return "http://twitpic.com/show/mini/" + mMediaCode; - case SMALL: - return "http://twitpic.com/show/thumb/" + mMediaCode; - case MEDIUM: - return "http://twitpic.com/show/thumb/" + mMediaCode; - case LARGE: - return "http://twitpic.com/show/full/" + mMediaCode; - } - break; - - case LOCKERZ: - switch (size) { - case THUMB: - return mMediaCode + "&size=thumbnail"; - case SMALL: - return mMediaCode + "&size=small"; - case MEDIUM: - return mMediaCode + "&size=medium"; - case LARGE: - return mMediaCode + "&size=big"; - } + case TWITTER: + switch (size) { + case THUMB: + return mMediaCode + ":thumb"; + case SMALL: + return mMediaCode + ":small"; + case MEDIUM: + return mMediaCode + ":medium"; + case LARGE: + return mMediaCode + ":large"; + } + break; + + case INSTAGRAM: + switch (size) { + case THUMB: + return mMediaCode + "?size=t"; + case SMALL: + return mMediaCode + "?size=t"; + case MEDIUM: + return mMediaCode + "?size=m"; + case LARGE: + return mMediaCode + "?size=l"; + } + break; + + case TWITPIC: + switch (size) { + case THUMB: + return "http://twitpic.com/show/mini/" + mMediaCode; + case SMALL: + return "http://twitpic.com/show/thumb/" + mMediaCode; + case MEDIUM: + return "http://twitpic.com/show/thumb/" + mMediaCode; + case LARGE: + return "http://twitpic.com/show/full/" + mMediaCode; + } + break; + + case LOCKERZ: + switch (size) { + case THUMB: + return mMediaCode + "&size=thumbnail"; + case SMALL: + return mMediaCode + "&size=small"; + case MEDIUM: + return mMediaCode + "&size=medium"; + case LARGE: + return mMediaCode + "&size=big"; + } - case YFROG: - switch (size) { - // http://yfrog.com/page/api#a5 - case THUMB: - return mMediaCode + ":small"; - case SMALL: - return mMediaCode + ":small"; - case MEDIUM: - return mMediaCode + ":iphone"; - case LARGE: - return mMediaCode + ":medium"; - } + case YFROG: + switch (size) { + // http://yfrog.com/page/api#a5 + case THUMB: + return mMediaCode + ":small"; + case SMALL: + return mMediaCode + ":small"; + case MEDIUM: + return mMediaCode + ":iphone"; + case LARGE: + return mMediaCode + ":medium"; + } - case IMGUR: - switch (size) { - // http://webapps.stackexchange.com/a/16104 - case THUMB: - return "http://i.imgur.com/" + mMediaCode + "s.png"; - case SMALL: - return "http://i.imgur.com/" + mMediaCode + "b.png"; - case MEDIUM: - return "http://i.imgur.com/" + mMediaCode + "m.png"; - case LARGE: - return "http://i.imgur.com/" + mMediaCode + ".png"; - } + case IMGUR: + switch (size) { + // http://webapps.stackexchange.com/a/16104 + case THUMB: + return "http://i.imgur.com/" + mMediaCode + "s.png"; + case SMALL: + return "http://i.imgur.com/" + mMediaCode + "b.png"; + case MEDIUM: + return "http://i.imgur.com/" + mMediaCode + "m.png"; + case LARGE: + return "http://i.imgur.com/" + mMediaCode + ".png"; + } - case YOUTUBE: { - switch (size) { - case THUMB: - case SMALL: - return "http://img.youtube.com/vi/" + mMediaCode - + "/default.jpg"; - case MEDIUM: - return "http://img.youtube.com/vi/" + mMediaCode - + "/mqdefault.jpg"; - case LARGE: - return "http://img.youtube.com/vi/" + mMediaCode - + "/hqdefault.jpg"; + case YOUTUBE: { + switch (size) { + case THUMB: + case SMALL: + return "http://img.youtube.com/vi/" + mMediaCode + + "/default.jpg"; + case MEDIUM: + return "http://img.youtube.com/vi/" + mMediaCode + + "/mqdefault.jpg"; + case LARGE: + return "http://img.youtube.com/vi/" + mMediaCode + + "/hqdefault.jpg"; + } } } - } return null; } diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatus.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatus.java index 8fe4109e..fb0e4850 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatus.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatus.java @@ -36,7 +36,7 @@ public class TwitterStatus implements Comparable { /* - * + * */ public TwitterStatus(TwitterStatus other) { mAuthorId = other.mAuthorId; @@ -138,9 +138,7 @@ public TwitterStatus(Status status) { mUserMentions = TwitterUtil.getUserMentions(retweetedStatus.getUserMentionEntities()); mIsRetweetedByMe = retweetedStatus.isRetweetedByMe(); } - } - else - { + } else { if (statusUser != null) { SetProfileImagesFromUser(new TwitterUser(statusUser)); } @@ -188,10 +186,8 @@ public TwitterStatus(AdnPost post) { mAuthorName = post.mOriginalAuthor.mName; mAuthorScreenName = post.mOriginalAuthor.mUserName; SetProfileImagesFromUser(new TwitterUser(post.mOriginalAuthor)); - mOriginalRetweetId = post.mOriginalAuthor.mId; - } - else - { + mOriginalRetweetId = post.mOriginalAuthor.mId; + } else { SetProfileImagesFromUser(new TwitterUser(post.mUser)); } @@ -204,8 +200,7 @@ public TwitterStatus(AdnPost post) { } - private void SetProfileImagesFromUser(TwitterUser user) - { + private void SetProfileImagesFromUser(TwitterUser user) { if (user.getProfileImageUrlOriginal() != null) { mProfileImageOriginalUrl = user.getProfileImageUrlOriginal(); } @@ -653,10 +648,9 @@ void setStatusMarkup(Status status) { void setStatusMarkup(String full) { mStatusFullMarkup = full; - if (mStatusFullMarkup != null) - { + if (mStatusFullMarkup != null) { mStatusFullSpanned = URLSpanNoUnderline.stripUnderlines(Html - .fromHtml(mStatusFullMarkup.replace("\n", "
    ") + " ")); + .fromHtml(mStatusFullMarkup.replace("\n", "
    ") + " ")); } } @@ -683,8 +677,7 @@ public void setRetweet(Boolean isRetweetedByMe) { public String getProfileImageUrl(TwitterManager.ProfileImageSize size) { - switch (size) - { + switch (size) { case MINI: return mProfileImageMiniUrl; case NORMAL: diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatusUpdate.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatusUpdate.java index 3a25b43e..8b3ef48f 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatusUpdate.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatusUpdate.java @@ -20,6 +20,8 @@ import android.graphics.BitmapFactory; import android.os.Environment; +import org.appdotnet4j.model.AdnPostCompose; + import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; @@ -28,7 +30,6 @@ import java.io.IOException; import java.io.OutputStream; -import org.appdotnet4j.model.AdnPostCompose; import twitter4j.StatusUpdate; public class TwitterStatusUpdate { @@ -51,13 +52,11 @@ public StatusUpdate getT4JStatusUpdate() { } if (mMediaFilePath != null) { - try{ + try { statusUpdate.setMedia(getMediaFile(mMediaFilePath)); - } - catch (IOException error){ + } catch (IOException error) { error.printStackTrace(); - } - catch (OutOfMemoryError error){ + } catch (OutOfMemoryError error) { error.printStackTrace(); } } @@ -67,13 +66,11 @@ public StatusUpdate getT4JStatusUpdate() { public AdnPostCompose getAdnComposePost() { File mediaFile = null; - try{ + try { mediaFile = getMediaFile(mMediaFilePath); - } - catch (IOException error){ + } catch (IOException error) { error.printStackTrace(); - } - catch (OutOfMemoryError error){ + } catch (OutOfMemoryError error) { error.printStackTrace(); } @@ -91,29 +88,27 @@ public void setMediaFilePath(String mediaFilePath) { private File getMediaFile(String mediaFilePath) throws IOException { - if(mediaFilePath==null){ + if (mediaFilePath == null) { return null; } File originalFile = new File(mediaFilePath); Bitmap resizeImage = TryResizeImage(originalFile); - if (resizeImage == null){ + if (resizeImage == null) { return originalFile; } File resizedFile = SaveImage(resizeImage); - if (resizedFile==null) - { + if (resizedFile == null) { return originalFile; } return resizedFile; } - private Bitmap TryResizeImage(File originalFile) throws FileNotFoundException - { + private Bitmap TryResizeImage(File originalFile) throws FileNotFoundException { Bitmap resizeImage = null; BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; @@ -127,15 +122,13 @@ private Bitmap TryResizeImage(File originalFile) throws FileNotFoundException int requiredWidth = 1500; int requiredHeight = 1500; - while (width_tmp / 2 >= requiredWidth || height_tmp / 2 >= requiredHeight) - { + while (width_tmp / 2 >= requiredWidth || height_tmp / 2 >= requiredHeight) { width_tmp /= 2; height_tmp /= 2; scale *= 2; } - if (scale > 1) - { + if (scale > 1) { // decode with inSampleSize options = new BitmapFactory.Options(); options.inSampleSize = scale; @@ -146,27 +139,21 @@ private Bitmap TryResizeImage(File originalFile) throws FileNotFoundException return resizeImage; } - private File SaveImage(Bitmap resizeImage) - { - File path = new File(Environment.getExternalStorageDirectory(),"temp/images/Tweet Lanes"); + private File SaveImage(Bitmap resizeImage) { + File path = new File(Environment.getExternalStorageDirectory(), "temp/images/Tweet Lanes"); File tempFile = null; OutputStream outStream = null; - try - { + try { path.mkdirs(); tempFile = File.createTempFile("img", ".jpeg", path); outStream = new BufferedOutputStream(new FileOutputStream(tempFile)); resizeImage.compress(Bitmap.CompressFormat.JPEG, 100, outStream); - } - catch (Exception ex) - { + } catch (Exception ex) { tempFile = null; - } - finally - { + } finally { if (outStream != null) { try { outStream.close(); diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatuses.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatuses.java index f742a8e8..b1c3fcf3 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatuses.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatuses.java @@ -16,10 +16,6 @@ package org.tweetalib.android.model; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - import org.appdotnet4j.model.AdnPost; import org.appdotnet4j.model.AdnPosts; import org.appdotnet4j.model.AdnUser; @@ -27,6 +23,11 @@ import org.json.JSONException; import org.json.JSONObject; import org.tweetalib.android.model.TwitterStatusesFilter.FilterType; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + import twitter4j.QueryResult; import twitter4j.ResponseList; import twitter4j.Status; @@ -35,7 +36,7 @@ public class TwitterStatuses { /* - * + * */ public TwitterStatuses(TwitterStatuses another) { _mStatuses = new ArrayList(another._mStatuses); @@ -151,27 +152,27 @@ public TwitterStatus getStatus(int index, TwitterStatusesFilter filter) { boolean isRetweet = status.mIsRetweet; switch (filterType) { - case HIDE_RETWEETS: - if (isRetweet) { - // filterCount += 1; - continue; - } - break; - case HIDE_REPLIES: - if (isReply) { - // filterCount += 1; - continue; - } - break; - case HIDE_RETWEETS_REPLIES: - if (isReply || isRetweet) { - // filterCount += 1; - continue; - } - break; - - default: - break; + case HIDE_RETWEETS: + if (isRetweet) { + // filterCount += 1; + continue; + } + break; + case HIDE_REPLIES: + if (isReply) { + // filterCount += 1; + continue; + } + break; + case HIDE_RETWEETS_REPLIES: + if (isReply || isRetweet) { + // filterCount += 1; + continue; + } + break; + + default: + break; } if (filteredIndex == index) { @@ -249,7 +250,7 @@ public interface AddUserCallback { * */ public void add(ResponseList statuses, - AddUserCallback addUserCallback) { + AddUserCallback addUserCallback) { TwitterStatus firstItem = size() > 0 ? get(0) : null; int addCount = 0; @@ -463,8 +464,7 @@ Integer getStatusIndexFromOriginalStatusId(long originalStatusId) { //Since original status ids have no order, a long search through each is required. - for (int i=0; i (); diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/widget/URLSpanNoUnderline.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/widget/URLSpanNoUnderline.java index 76cf0fc6..0587245e 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/widget/URLSpanNoUnderline.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/widget/URLSpanNoUnderline.java @@ -29,7 +29,7 @@ public class URLSpanNoUnderline extends URLSpan { /* - * + * */ private URLSpanNoUnderline(String url) { super(url); From 86559e3b43e021d6df516d58bc96c7d866dc05cf Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Sat, 17 Aug 2013 13:44:17 +0100 Subject: [PATCH 063/163] fix for #193, added a long press listener on the media preview. when you long press the image is unattached. --- .../libraries/TweetLanesCore/res/xml/changelog.xml | 1 + .../android/core/model/ComposeTweetDefault.java | 4 ++++ .../android/core/view/ComposeTweetFragment.java | 13 +++++++++++++ 3 files changed, 18 insertions(+) diff --git a/android/libraries/TweetLanesCore/res/xml/changelog.xml b/android/libraries/TweetLanesCore/res/xml/changelog.xml index 50bb84e7..85ad211c 100644 --- a/android/libraries/TweetLanesCore/res/xml/changelog.xml +++ b/android/libraries/TweetLanesCore/res/xml/changelog.xml @@ -5,6 +5,7 @@ Feature - Added Holo Light Dark Actionbar Theme Feature - Added "Extra Extra Large" and "Supersize" font sizes Feature - Extended the auto complete to match typed text anywhere in username and in full name + Feature - Added ability to remove an attached image by pressing and holding Fix - Links are now shown in full, rather than a "display link" Fix - Links in profile descriptions converted from t.co links Fix - Reply when loading profile correction. Show "Tweet @username" diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/model/ComposeTweetDefault.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/model/ComposeTweetDefault.java index 86fca57f..36a424b1 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/model/ComposeTweetDefault.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/model/ComposeTweetDefault.java @@ -162,6 +162,10 @@ public void setMediaFilePath(String filePath) { mMediaFilePath = filePath; } + public void clearMediaFilePath() { + mMediaFilePath = null; + } + public Long getInReplyToStatusId() { return mInReplyToStatusId; } diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ComposeTweetFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ComposeTweetFragment.java index 92344475..6ffcfb14 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ComposeTweetFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ComposeTweetFragment.java @@ -65,6 +65,19 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, .findViewById(R.id.statusImage); mAttachImagePreview.setVisibility(View.GONE); + mAttachImagePreview.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View view) { + + if (mListener != null) { + mListener.onMediaDetach(); + } + getComposeTweetDefault().clearMediaFilePath(); + mAttachImagePreview.setVisibility(View.GONE); + return true; + } + }); + return resultView; } From 79411fb51dc6acc0b53c1c9b77226e242fa7ceaa Mon Sep 17 00:00:00 2001 From: Jason Famularo Date: Sat, 17 Aug 2013 23:30:11 -0400 Subject: [PATCH 064/163] Basic url handing happy case for Twitter --- android/client/.idea/dictionaries/Jason.xml | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 android/client/.idea/dictionaries/Jason.xml diff --git a/android/client/.idea/dictionaries/Jason.xml b/android/client/.idea/dictionaries/Jason.xml deleted file mode 100644 index e4a5141b..00000000 --- a/android/client/.idea/dictionaries/Jason.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file From 7771af774a65c6fb5c4b8f3082a17aaff50b4d1f Mon Sep 17 00:00:00 2001 From: Jason Famularo Date: Sat, 17 Aug 2013 23:30:11 -0400 Subject: [PATCH 065/163] Basic url handing happy case for Twitter --- android/client/.idea/dictionaries/Jason.xml | 3 --- android/client/AndroidManifest.xml | 12 ++++++++++++ android/clientbeta/AndroidManifest.xml | 12 ++++++++++++ .../src/com/tweetlanes/android/core/Notifier.java | 4 ++-- .../core/dashclock/TweetLanesExtension.java | 2 +- .../android/core/view/BaseLaneActivity.java | 3 +++ .../android/core/view/BootActivity.java | 14 ++++++++++++++ .../android/core/view/HomeActivity.java | 15 +++++++++++++-- .../android/core/view/TweetSpotlightActivity.java | 7 +++++-- 9 files changed, 62 insertions(+), 10 deletions(-) delete mode 100644 android/client/.idea/dictionaries/Jason.xml diff --git a/android/client/.idea/dictionaries/Jason.xml b/android/client/.idea/dictionaries/Jason.xml deleted file mode 100644 index e4a5141b..00000000 --- a/android/client/.idea/dictionaries/Jason.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/android/client/AndroidManifest.xml b/android/client/AndroidManifest.xml index f1116739..9d48b1d6 100644 --- a/android/client/AndroidManifest.xml +++ b/android/client/AndroidManifest.xml @@ -32,6 +32,18 @@ + + + + + + + + + + + + + + + + + + + + + + + + nextClass = HomeActivity.class; if (!getApp().getTutorialCompleted()) { nextClass = TutorialActivity.class; @@ -93,6 +95,18 @@ void jumpToNext() { Intent intent = new Intent(getApplicationContext(), nextClass); intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); + + Uri uriData = getIntent().getData(); + if (uriData != null) { + if (uriData.getHost().contains("twitter")) { + String statusId = uriData.getLastPathSegment(); + intent.putExtra("uri_status_id", statusId); + } + else if (uriData.getHost().contains("app.net")) { + } + } + + overridePendingTransition(0, 0); startActivity(intent); } diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java index dcff9f88..f5511ff8 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java @@ -61,6 +61,7 @@ import org.tweetalib.android.TwitterManager; import org.tweetalib.android.TwitterPaging; import org.tweetalib.android.model.TwitterLists; +import org.tweetalib.android.model.TwitterStatus; import org.tweetalib.android.model.TwitterUser; import org.tweetalib.android.model.TwitterUsers; @@ -94,9 +95,10 @@ protected void onCreate(Bundle savedInstanceState) { Bundle extras = getIntent().getExtras(); if (extras != null) { + // Notifications String accountKey = extras.getString("account_key"); String notificationType = extras.getString("notification_type"); - long postId = extras.getLong("post_id"); + long notificationPostId = extras.getLong("notification_post_id"); String laneName = extras.getString("lane"); if (accountKey != null) { @@ -104,7 +106,7 @@ protected void onCreate(Bundle savedInstanceState) { getIntent().removeExtra("notification_type"); AccountDescriptor notificationAccount = getApp().getAccountByKey(accountKey); - Notifier.saveLastNotificationActioned(this, accountKey, notificationType, postId); + Notifier.saveLastNotificationActioned(this, accountKey, notificationType, notificationPostId); Constant.LaneType notificationLaneType = notificationType.equals(SharedPreferencesConstants.NOTIFICATION_TYPE_MENTION) ? Constant.LaneType.USER_MENTIONS : Constant.LaneType.DIRECT_MESSAGES; @@ -127,6 +129,15 @@ protected void onCreate(Bundle savedInstanceState) { mDefaultLaneOverride = index; } } + + // URI handling + String uriStatusId = extras.getString("uri_status_id"); + if (uriStatusId != null) { + Intent tweetSpotlightIntent = new Intent(this, TweetSpotlightActivity.class); + tweetSpotlightIntent.putExtra("statusId", uriStatusId); + tweetSpotlightIntent.putExtra("clearCompose", "true"); + startActivityForResult(tweetSpotlightIntent, Constant.REQUEST_CODE_SPOTLIGHT); + } } // Attempt at fixing a crash found in HomeActivity diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetSpotlightActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetSpotlightActivity.java index 1df5a6c6..0848f389 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetSpotlightActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetSpotlightActivity.java @@ -70,7 +70,10 @@ protected void onCreate(Bundle savedInstanceState) { statusId = Long.parseLong(statusIdAsString); } - TwitterStatus status = new TwitterStatus(statusAsString); + TwitterStatus status = null; + if (statusAsString != null) { + status = new TwitterStatus(statusAsString); + } BaseLaneFragment fragment = super.getFragmentAtIndex(0); super.setCurrentComposeFragment((fragment instanceof DirectMessageFeedFragment) ? super.COMPOSE_DIRECT_MESSAGE @@ -85,7 +88,7 @@ protected void onCreate(Bundle savedInstanceState) { mViewSwitcher = (ViewSwitcher) findViewById(R.id.rootViewSwitcher); updateViewVisibility(); - if (status.mId == statusId) { + if (status != null && status.mId == statusId) { onGetStatus(status); } else if (statusId > 0) { mGetStatusCallback = TwitterManager.get().getFetchStatusInstance().new FinishedCallback() { From 9b9bcddde12f48c1cc66664ad6212f19bf03009e Mon Sep 17 00:00:00 2001 From: Jason Famularo Date: Sun, 18 Aug 2013 15:14:38 -0400 Subject: [PATCH 066/163] Don't go back to home activity when launching tweet from link --- .../android/core/view/BootActivity.java | 34 ++++++++++++------- .../android/core/view/HomeActivity.java | 9 ----- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BootActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BootActivity.java index a9856b05..7046f7b8 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BootActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BootActivity.java @@ -81,7 +81,19 @@ void jumpToNext() { startActivity(intent); } else { if (TwitterManager.get().hasValidTwitterInstance()) { - if (mLastStartedClass != HomeActivity.class) { + + Uri uriData = getIntent().getData(); + if (uriData != null) { + String host = uriData.getHost(); + finish(); + if (host.contains("twitter")) { + String statusId = uriData.getLastPathSegment(); + startTweetSpotlight(statusId); + } + else if (host.contains("app.net")) { + } + } + else if (mLastStartedClass != HomeActivity.class) { mLastStartedClass = HomeActivity.class; // We don't want to come back here, so remove from the // activity stack @@ -96,17 +108,6 @@ void jumpToNext() { nextClass); intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); - Uri uriData = getIntent().getData(); - if (uriData != null) { - if (uriData.getHost().contains("twitter")) { - String statusId = uriData.getLastPathSegment(); - intent.putExtra("uri_status_id", statusId); - } - else if (uriData.getHost().contains("app.net")) { - } - } - - overridePendingTransition(0, 0); startActivity(intent); } @@ -114,5 +115,14 @@ else if (uriData.getHost().contains("app.net")) { // TODO: Handle this case } } + + } + + private void startTweetSpotlight(String statusId) { + Intent tweetSpotlightIntent = new Intent(this, TweetSpotlightActivity.class); + tweetSpotlightIntent.putExtra("statusId", statusId); + tweetSpotlightIntent.putExtra("clearCompose", "true"); + overridePendingTransition(0, 0); + startActivity(tweetSpotlightIntent); } } diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java index f5511ff8..59183961 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java @@ -129,15 +129,6 @@ protected void onCreate(Bundle savedInstanceState) { mDefaultLaneOverride = index; } } - - // URI handling - String uriStatusId = extras.getString("uri_status_id"); - if (uriStatusId != null) { - Intent tweetSpotlightIntent = new Intent(this, TweetSpotlightActivity.class); - tweetSpotlightIntent.putExtra("statusId", uriStatusId); - tweetSpotlightIntent.putExtra("clearCompose", "true"); - startActivityForResult(tweetSpotlightIntent, Constant.REQUEST_CODE_SPOTLIGHT); - } } // Attempt at fixing a crash found in HomeActivity From 8d6a060ebbf61c19b07e2d6d84038277932fb595 Mon Sep 17 00:00:00 2001 From: Jason Famularo Date: Sun, 18 Aug 2013 16:01:18 -0400 Subject: [PATCH 067/163] App.net support for URL handing. --- android/client/AndroidManifest.xml | 6 +++++ android/clientbeta/AndroidManifest.xml | 6 +++++ .../android/core/view/BootActivity.java | 23 +++++++++++++++++-- .../android/core/view/HomeActivity.java | 1 - 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/android/client/AndroidManifest.xml b/android/client/AndroidManifest.xml index 9d48b1d6..68a0f1ca 100644 --- a/android/client/AndroidManifest.xml +++ b/android/client/AndroidManifest.xml @@ -44,6 +44,12 @@ + + + + + + + + + + + + Date: Mon, 19 Aug 2013 07:04:45 +0100 Subject: [PATCH 068/163] Added a toast when the last position cannot be found to warn user something has gone wrong post refresh. Also added a second statusid to try and use. Finally, changed logic to refresh feed when you load the app. This may actually be causing problems. --- .../TweetLanesCore/res/values/strings.xml | 1 + .../android/core/view/TweetFeedFragment.java | 65 ++++++++++--------- 2 files changed, 37 insertions(+), 29 deletions(-) diff --git a/android/libraries/TweetLanesCore/res/values/strings.xml b/android/libraries/TweetLanesCore/res/values/strings.xml index 5f1e0080..263f8c71 100644 --- a/android/libraries/TweetLanesCore/res/values/strings.xml +++ b/android/libraries/TweetLanesCore/res/values/strings.xml @@ -174,6 +174,7 @@ Failed to post status Posting Posting … + The position on the feed has been lost Tweet Text Link to Tweet diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index a992eeaa..391b7dcb 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -204,19 +204,17 @@ private void configureInitialStatuses() { TwitterStatuses cachedFeed = TwitterManager.get().getContentFeed(mContentHandle); if (cachedFeed != null && cachedFeed.getStatusCount(getBaseLaneActivity().mStatusesFilter) > 0) { setStatusFeed(cachedFeed, true); - } else { - if (configuredCachedStatuses) { - autoUpdateStatuses = true; - } else { - setStatusFeed(null, true); - } + } else if (!configuredCachedStatuses) { + autoUpdateStatuses = true; + setStatusFeed(null, true); } if (getStatusFeed() == null || getFilteredStatusCount() == 0) { updateViewVisibility(false); setInitialDownloadState(InitialDownloadState.WAITING); } else { - if (autoUpdateStatuses && mTweetDataRefreshCallback == null) { + + if (autoUpdateStatuses) { fetchNewestTweets(); } @@ -405,7 +403,7 @@ public String getDataToCache() { } /* - * + * */ boolean configureCachedStatuses() { @@ -478,7 +476,7 @@ public void finished(TwitterFetchResult fetchResult, TwitterStatuses feed, Twitt } /* - * + * */ private final BroadcastReceiver mVolumeUpKeyDownReceiver = new BroadcastReceiver() { @@ -820,33 +818,42 @@ private void onRefreshFinished(TwitterFetchResult result, TwitterStatuses feed) int newCount = newFeedCount - oldFeedCount; if (newCount > 0) { + Integer statusIndex = null; + if (visibleStatus != null) { - Integer statusIndex = getStatusFeed().getStatusIndex(visibleStatus.mId); - if (statusIndex != null) { - mTweetFeedListView.getRefreshableView() - .setSelectionFromTop(statusIndex.intValue(), mScrollTracker.getFirstVisibleYOffset()); + statusIndex = getStatusFeed().getStatusIndex(visibleStatus.mId); + } else if (mLastTwitterStatusIdSeen != null) { + statusIndex = getStatusFeed().getStatusIndex(mLastTwitterStatusIdSeen); + } - int total = getStatusFeed().getStatusCount(); - int newStatuses = 0; + if (statusIndex != null) { + mTweetFeedListView.getRefreshableView() + .setSelectionFromTop(statusIndex.intValue(), mScrollTracker.getFirstVisibleYOffset()); - for (int i = 0; i < total; i++) { - TwitterStatus status = getStatusFeed().getStatus(i); - if (status != null && status.mId > visibleStatus.mId) { - newStatuses++; - } - } + int total = getStatusFeed().getStatusCount(); + int newStatuses = 0; - mNewStatuses = newStatuses; - mLastTwitterStatusIdSeen = visibleStatus.mId; + for (int i = 0; i < total; i++) { + TwitterStatus status = getStatusFeed().getStatus(i); + if (status != null && status.mId > visibleStatus.mId) { + newStatuses++; + } } + + mNewStatuses = newStatuses; + mLastTwitterStatusIdSeen = visibleStatus.mId; } } + else{ + showToast(getString(R.string.lost_position)); + } + mTweetDataRefreshCallback = null; } /* - * - */ + * + */ private final OnRefreshListener mTweetFeedOnRefreshListener = new OnRefreshListener() { @Override @@ -1132,8 +1139,8 @@ private TwitterStatus getFirstSelectedStatus() { } /* - * - */ + * + */ enum ItemSelectedState { NONE, SOME, @@ -1181,8 +1188,8 @@ private boolean doesTwitterStatusBelongToMe(TwitterStatus status) { } /* - * - */ + * + */ private class MultipleTweetSelectionCallback implements ListView.MultiChoiceModeListener { private MenuItem mFavoriteMenuItem; From 43f1008231d40b76762288eb8d6fd59cd47258c8 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Mon, 19 Aug 2013 07:28:06 +0100 Subject: [PATCH 069/163] Fix a null pointer error i received --- .../core/view/TweetSpotlightFragment.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetSpotlightFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetSpotlightFragment.java index 45489032..4beaae66 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetSpotlightFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetSpotlightFragment.java @@ -75,10 +75,19 @@ public void finished(TwitterFetchResult result, TwitterStatus status) { if (mTweetFeedListAdapter != null) { onStatusRefresh(status); updateViewVisibility(); - } else if (result.getErrorMessage().contains("does not exist")) { - TweetSpotlightActivity spotlightActivity = (TweetSpotlightActivity) getActivity(); - if (spotlightActivity != null) { - spotlightActivity.TweetDeleted(result.getErrorMessage()); + } else { + String errorMessage = ""; + if (result != null) { + errorMessage = result.getErrorMessage(); + if (errorMessage == null) { + errorMessage = ""; + } + } + if (errorMessage.contains("does not exist")) { + TweetSpotlightActivity spotlightActivity = (TweetSpotlightActivity) getActivity(); + if (spotlightActivity != null) { + spotlightActivity.TweetDeleted(errorMessage); + } } } mGetStatusCallback = null; From 1f4da43f5daed7f359b98a783d4d97c0df69b2b8 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Mon, 19 Aug 2013 10:08:04 +0100 Subject: [PATCH 070/163] Corrected XML layout in change log --- android/libraries/TweetLanesCore/res/xml/changelog.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/android/libraries/TweetLanesCore/res/xml/changelog.xml b/android/libraries/TweetLanesCore/res/xml/changelog.xml index 85ad211c..94f93d07 100644 --- a/android/libraries/TweetLanesCore/res/xml/changelog.xml +++ b/android/libraries/TweetLanesCore/res/xml/changelog.xml @@ -6,16 +6,16 @@ Feature - Added "Extra Extra Large" and "Supersize" font sizes Feature - Extended the auto complete to match typed text anywhere in username and in full name Feature - Added ability to remove an attached image by pressing and holding - Fix - Links are now shown in full, rather than a "display link" + Fix - Links are now shown in full, rather than a "display link" Fix - Links in profile descriptions converted from t.co links Fix - Reply when loading profile correction. Show "Tweet @username" - Fix - Correct issues around compose box after loading profile - Fix - Use the t.co display url, rather than expanded url. These are formatted nicer - Fix - Fix issue when more than 1 page of tweets. Fetch only completes when all tweets collected preventing feed jumping + Fix - Correct issues around compose box after loading profile + Fix - Use the t.co display url, rather than expanded url. These are formatted nicer + Fix - Fix issue when more than 1 page of tweets. Fetch only completes when all tweets collected preventing feed jumping Fix - Change the message when you try and send an empty status update Fix - Correct issue with the new tweet bar when orientation changes and account switches Fix - Profile and service icon only show when you use both networks, or have 3 or more accounts - Other - Large codebase tidy-up - hopefully small improvement to performance, size and reliability + Other - Large codebase tidy-up - hopefully small improvement to performance, size and reliability Feature - Auto complete of @mentions and #hashtags From 63df1b139e7229c6bede4cd1e3db368ac5a71911 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Mon, 19 Aug 2013 10:09:03 +0100 Subject: [PATCH 071/163] Added @Fammy URL handling to the change log --- android/libraries/TweetLanesCore/res/xml/changelog.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/android/libraries/TweetLanesCore/res/xml/changelog.xml b/android/libraries/TweetLanesCore/res/xml/changelog.xml index 94f93d07..3503ed4b 100644 --- a/android/libraries/TweetLanesCore/res/xml/changelog.xml +++ b/android/libraries/TweetLanesCore/res/xml/changelog.xml @@ -6,6 +6,7 @@ Feature - Added "Extra Extra Large" and "Supersize" font sizes Feature - Extended the auto complete to match typed text anywhere in username and in full name Feature - Added ability to remove an attached image by pressing and holding + Feature - Added URL handling so that Tweetlanes is a choice when loading Twitter or App.net items Fix - Links are now shown in full, rather than a "display link" Fix - Links in profile descriptions converted from t.co links Fix - Reply when loading profile correction. Show "Tweet @username" From d14c889e8f834b030d727e209fa582b3cc0bdef2 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Tue, 20 Aug 2013 07:32:42 +0100 Subject: [PATCH 072/163] Added some extra logic to try and set the last twitter status seen so after refresh the timeline can be loaded correctly. Also corrected the incorrect load toast. and made it so the last seen twitter status can never decrease. --- .../android/core/view/TweetFeedFragment.java | 35 +++++++++++++------ 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index 391b7dcb..bb3729eb 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -272,6 +272,11 @@ public void finished(TwitterFetchResult fetchResult, TwitterStatuses feed, } }; + TwitterStatus visibleStatus = getVisibleStatus(); + if(visibleStatus != null && mLastTwitterStatusIdSeen < visibleStatus.mId) { + mLastTwitterStatusIdSeen = visibleStatus.mId; + } + Log.d("api-call", "--fetchNewestTweets(" + mContentHandle.getStatusesType().toString() + ")"); TwitterPaging paging = new TwitterPaging(null, null, sinceStatusId, maxStatusId); TwitterManager.get().triggerFetchStatuses(mContentHandle, paging, mTweetDataRefreshCallback, @@ -679,8 +684,8 @@ public void finished(TwitterFetchResult result, TwitterStatuses feed, } }; - private Long mTwitterStatusIdWhenRefreshed; - private Long mLastTwitterStatusIdSeen; + private Long mTwitterStatusIdWhenRefreshed = 0L; + private Long mLastTwitterStatusIdSeen = 0L; private int mCurrentFirstVisibleItem = 0; private int mNewStatuses = 0; @@ -693,8 +698,11 @@ void beginListHeadingCount() { TwitterStatus status = getStatusFeed().getStatus(mCurrentFirstVisibleItem); TwitterStatus visibleStatus = getVisibleStatus(); mTwitterStatusIdWhenRefreshed = status.mId; - mLastTwitterStatusIdSeen = visibleStatus.mId; mHidingListHeading = false; + + if(visibleStatus != null && mLastTwitterStatusIdSeen < visibleStatus.mId) { + mLastTwitterStatusIdSeen = visibleStatus.mId; + } } } } @@ -725,12 +733,16 @@ void updateListHeading(int firstVisibleItem) { SocialNetConstant.Type socialNetType = getApp().getCurrentAccount().getSocialNetType(); + TwitterStatus status = getStatusFeed().getStatus(firstVisibleItem); + if (mLastTwitterStatusIdSeen < status.mId) { + mLastTwitterStatusIdSeen = status.mId; + } + if (mTwitterStatusIdWhenRefreshed != null && mTwitterStatusIdWhenRefreshed > 0 && firstVisibleItem > 0) { + if (!mHidingListHeading) { - TwitterStatus status = getStatusFeed().getStatus(firstVisibleItem); if ((mNewStatuses == 0 || status.mId >= mTwitterStatusIdWhenRefreshed) && status.mId >= mLastTwitterStatusIdSeen) { mNewStatuses = firstVisibleItem; - mLastTwitterStatusIdSeen = status.mId; } setListHeadingVisiblilty(View.VISIBLE); @@ -833,19 +845,22 @@ private void onRefreshFinished(TwitterFetchResult result, TwitterStatuses feed) int total = getStatusFeed().getStatusCount(); int newStatuses = 0; + if(visibleStatus != null && mLastTwitterStatusIdSeen < visibleStatus.mId) { + mLastTwitterStatusIdSeen = visibleStatus.mId; + } + for (int i = 0; i < total; i++) { TwitterStatus status = getStatusFeed().getStatus(i); - if (status != null && status.mId > visibleStatus.mId) { + if (status != null && status.mId > mLastTwitterStatusIdSeen) { newStatuses++; } } mNewStatuses = newStatuses; - mLastTwitterStatusIdSeen = visibleStatus.mId; } - } - else{ - showToast(getString(R.string.lost_position)); + else{ + showToast(getString(R.string.lost_position)); + } } mTweetDataRefreshCallback = null; From 3cc656aa0c5f33bd085f071a049c5d46fd878709 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Tue, 20 Aug 2013 07:33:54 +0100 Subject: [PATCH 073/163] Prevent new tweet bar showing with the number 0. --- .../android/core/view/TweetFeedFragment.java | 37 ++++++++++--------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index bb3729eb..881bf7d0 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -273,7 +273,7 @@ public void finished(TwitterFetchResult fetchResult, TwitterStatuses feed, }; TwitterStatus visibleStatus = getVisibleStatus(); - if(visibleStatus != null && mLastTwitterStatusIdSeen < visibleStatus.mId) { + if (visibleStatus != null && mLastTwitterStatusIdSeen < visibleStatus.mId) { mLastTwitterStatusIdSeen = visibleStatus.mId; } @@ -503,7 +503,7 @@ public void onReceive(Context context, Intent intent) { }; /* - * + * */ private final BroadcastReceiver mVolumeDownKeyDownReceiver = new BroadcastReceiver() { @@ -700,7 +700,7 @@ void beginListHeadingCount() { mTwitterStatusIdWhenRefreshed = status.mId; mHidingListHeading = false; - if(visibleStatus != null && mLastTwitterStatusIdSeen < visibleStatus.mId) { + if (visibleStatus != null && mLastTwitterStatusIdSeen < visibleStatus.mId) { mLastTwitterStatusIdSeen = visibleStatus.mId; } } @@ -733,23 +733,27 @@ void updateListHeading(int firstVisibleItem) { SocialNetConstant.Type socialNetType = getApp().getCurrentAccount().getSocialNetType(); - TwitterStatus status = getStatusFeed().getStatus(firstVisibleItem); - if (mLastTwitterStatusIdSeen < status.mId) { - mLastTwitterStatusIdSeen = status.mId; - } - if (mTwitterStatusIdWhenRefreshed != null && mTwitterStatusIdWhenRefreshed > 0 && firstVisibleItem > 0) { - if (!mHidingListHeading) { + TwitterStatus status = getStatusFeed().getStatus(firstVisibleItem); if ((mNewStatuses == 0 || status.mId >= mTwitterStatusIdWhenRefreshed) && status.mId >= mLastTwitterStatusIdSeen) { mNewStatuses = firstVisibleItem; + mLastTwitterStatusIdSeen = status.mId; } - setListHeadingVisiblilty(View.VISIBLE); - mListHeadingTextView.setText(mNewStatuses + " " + getString(mNewStatuses == 1 ? - socialNetType == SocialNetConstant.Type.Twitter ? R.string.new_tweet : R.string.new_post : - socialNetType == SocialNetConstant.Type.Twitter ? R.string.new_tweets : - R.string.new_posts)); + if (mNewStatuses > 0) + { + setListHeadingVisiblilty(View.VISIBLE); + mListHeadingTextView.setText(mNewStatuses + " " + getString(mNewStatuses == 1 ? + socialNetType == SocialNetConstant.Type.Twitter ? R.string.new_tweet : R.string.new_post : + socialNetType == SocialNetConstant.Type.Twitter ? R.string.new_tweets : + R.string.new_posts)); + } + else + { + setListHeadingVisiblilty(View.GONE); + mTwitterStatusIdWhenRefreshed = null; + } } } else { setListHeadingVisiblilty(View.GONE); @@ -845,7 +849,7 @@ private void onRefreshFinished(TwitterFetchResult result, TwitterStatuses feed) int total = getStatusFeed().getStatusCount(); int newStatuses = 0; - if(visibleStatus != null && mLastTwitterStatusIdSeen < visibleStatus.mId) { + if (visibleStatus != null && mLastTwitterStatusIdSeen < visibleStatus.mId) { mLastTwitterStatusIdSeen = visibleStatus.mId; } @@ -857,8 +861,7 @@ private void onRefreshFinished(TwitterFetchResult result, TwitterStatuses feed) } mNewStatuses = newStatuses; - } - else{ + } else { showToast(getString(R.string.lost_position)); } } From 53a098eada7cc0a82ef63c5a4eb49d01096f46ce Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Tue, 20 Aug 2013 07:35:17 +0100 Subject: [PATCH 074/163] Change default value of last ids when reloading state to be 0 rather than null --- .../com/tweetlanes/android/core/view/TweetFeedFragment.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index 881bf7d0..e84cd0a2 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -171,8 +171,8 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa if (savedInstanceState != null) { - mTwitterStatusIdWhenRefreshed = savedInstanceState.containsKey("TwitterStatusIdWhenRefreshed") ? savedInstanceState.getLong("TwitterStatusIdWhenRefreshed") : null; - mLastTwitterStatusIdSeen = savedInstanceState.containsKey("LastTwitterStatusIdSeen") ? savedInstanceState.getLong("LastTwitterStatusIdSeen") : null; + mTwitterStatusIdWhenRefreshed = savedInstanceState.containsKey("TwitterStatusIdWhenRefreshed") ? savedInstanceState.getLong("TwitterStatusIdWhenRefreshed") : 0L; + mLastTwitterStatusIdSeen = savedInstanceState.containsKey("LastTwitterStatusIdSeen") ? savedInstanceState.getLong("LastTwitterStatusIdSeen") : 0L; mNewStatuses = savedInstanceState.getInt("NewStatuses", 0); mHidingListHeading = savedInstanceState.getBoolean("HidingListHeading", false); } From 97cad30e83728433079d0d5fcf6c85183c374260 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Tue, 20 Aug 2013 07:50:58 +0100 Subject: [PATCH 075/163] Remove logic on refresh finished to only perform the checking of new status if the number of items in the feed has increased. There is no harm in doing this always and have a hunch this is where the problem might be. --- .../android/core/view/TweetFeedFragment.java | 50 ++++++++----------- 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index e84cd0a2..755de458 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -822,48 +822,42 @@ private void onRefreshFinished(TwitterFetchResult result, TwitterStatuses feed) TwitterStatus visibleStatus = getVisibleStatus(); - int oldFeedCount = getFilteredStatusCount(); - if (feed != null) { setStatusFeed(feed, true); } - int newFeedCount = getFilteredStatusCount(); mTweetFeedListView.onRefreshComplete(); mTweetFeedListAdapter.notifyDataSetChanged(); - int newCount = newFeedCount - oldFeedCount; - if (newCount > 0) { - Integer statusIndex = null; + Integer statusIndex = null; - if (visibleStatus != null) { - statusIndex = getStatusFeed().getStatusIndex(visibleStatus.mId); - } else if (mLastTwitterStatusIdSeen != null) { - statusIndex = getStatusFeed().getStatusIndex(mLastTwitterStatusIdSeen); - } + if (visibleStatus != null) { + statusIndex = getStatusFeed().getStatusIndex(visibleStatus.mId); + } else if (mLastTwitterStatusIdSeen != null) { + statusIndex = getStatusFeed().getStatusIndex(mLastTwitterStatusIdSeen); + } - if (statusIndex != null) { - mTweetFeedListView.getRefreshableView() - .setSelectionFromTop(statusIndex.intValue(), mScrollTracker.getFirstVisibleYOffset()); + if (statusIndex != null) { + mTweetFeedListView.getRefreshableView() + .setSelectionFromTop(statusIndex.intValue(), mScrollTracker.getFirstVisibleYOffset()); - int total = getStatusFeed().getStatusCount(); - int newStatuses = 0; + int total = getStatusFeed().getStatusCount(); + int newStatuses = 0; - if (visibleStatus != null && mLastTwitterStatusIdSeen < visibleStatus.mId) { - mLastTwitterStatusIdSeen = visibleStatus.mId; - } + if (visibleStatus != null && mLastTwitterStatusIdSeen < visibleStatus.mId) { + mLastTwitterStatusIdSeen = visibleStatus.mId; + } - for (int i = 0; i < total; i++) { - TwitterStatus status = getStatusFeed().getStatus(i); - if (status != null && status.mId > mLastTwitterStatusIdSeen) { - newStatuses++; - } + for (int i = 0; i < total; i++) { + TwitterStatus status = getStatusFeed().getStatus(i); + if (status != null && status.mId > mLastTwitterStatusIdSeen) { + newStatuses++; } - - mNewStatuses = newStatuses; - } else { - showToast(getString(R.string.lost_position)); } + + mNewStatuses = newStatuses; + } else { + showToast(getString(R.string.lost_position)); } mTweetDataRefreshCallback = null; From 8d9d1a8aabab75360f2282916aab88dff902fb6d Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Tue, 20 Aug 2013 19:32:44 +0100 Subject: [PATCH 076/163] Change list collection to a vector and add a syncronise block to prevent a collection modification exception --- .../android/core/model/AccountDescriptor.java | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/model/AccountDescriptor.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/model/AccountDescriptor.java index 6373b20b..ba171a13 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/model/AccountDescriptor.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/model/AccountDescriptor.java @@ -28,6 +28,7 @@ import org.tweetalib.android.model.TwitterUser; import java.util.ArrayList; +import java.util.Vector; public class AccountDescriptor { @@ -90,7 +91,7 @@ public AccountDescriptor(Context context, String jsonAsString) { mProfileImageUrl = object.getString(KEY_PROFILE_IMAGE_URL); } if (object.has(KEY_LISTS)) { - mLists = new ArrayList(); + mLists = new Vector(); String listsAsString = object.getString(KEY_LISTS); JSONArray jsonArray = new JSONArray(listsAsString); for (int i = 0; i < jsonArray.length(); i++) { @@ -127,7 +128,7 @@ private void initCommon(ArrayList displayedLanes) { mLaneDefinitions = new ArrayList(); if (mLists == null) { - mLists = new ArrayList(); + mLists = new Vector(); } configureLaneDefinitions(displayedLanes); } @@ -192,16 +193,19 @@ private void configureLaneDefinitions(ArrayList displayedLanes) { TwitterConstant.DirectMessagesType.ALL_MESSAGES))); // Add lists - for (List list : mLists) { - if (list.mId != null) { - mLaneDefinitions - .add(new LaneDescriptor( - Constant.LaneType.USER_LIST_TIMELINE, - list.mName, - String.valueOf(list.mId), - new TwitterContentHandleBase( - TwitterConstant.ContentType.STATUSES, - TwitterConstant.StatusesType.USER_LIST_TIMELINE))); + synchronized (mLists) + { + for (List list : mLists) { + if (list.mId != null) { + mLaneDefinitions + .add(new LaneDescriptor( + Constant.LaneType.USER_LIST_TIMELINE, + list.mName, + String.valueOf(list.mId), + new TwitterContentHandleBase( + TwitterConstant.ContentType.STATUSES, + TwitterConstant.StatusesType.USER_LIST_TIMELINE))); + } } } } @@ -248,7 +252,7 @@ public boolean updateTwitterLists(TwitterLists twitterLists) { if (mLists != null) { mLists.clear(); } else { - mLists = new ArrayList(); + mLists = new Vector(); } boolean changed = false; if (twitterLists != null && twitterLists.getListCount() > 0) { @@ -479,7 +483,7 @@ public boolean shouldRefreshLists() { private ArrayList mLaneDefinitions; private boolean mLaneDefinitionsDirty; private Integer mInitialLaneIndex; - private ArrayList mLists; + private Vector mLists; private boolean mShouldRefreshLists; private final Context mContext; private SocialNetConstant.Type mSocialNetType; From 417afb27b02c4bb3cd7367fed93dd47f84c96015 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Tue, 20 Aug 2013 19:48:11 +0100 Subject: [PATCH 077/163] Added a feature #124 to make fetching more efficient starting with smaller pages, and getting progressively larger --- .../src/org/tweetalib/android/TwitterPaging.java | 2 ++ .../android/fetch/TwitterFetchStatuses.java | 2 ++ .../android/core/view/TweetFeedFragment.java | 15 ++++++++++++++- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterPaging.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterPaging.java index 38f35aef..c5927f7c 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterPaging.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterPaging.java @@ -25,6 +25,8 @@ public class TwitterPaging { public static final int DEFAULT_STATUS_COUNT = 100; + public static final int INCREMENTING_STATUS_COUNT_START = 25; + public static final int INCREMENTING_STATUS_COUNT_MAX = 200; /* * diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/fetch/TwitterFetchStatuses.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/fetch/TwitterFetchStatuses.java index 20209c55..9e6a9d56 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/fetch/TwitterFetchStatuses.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/fetch/TwitterFetchStatuses.java @@ -486,6 +486,8 @@ public void addUser(AdnUser user) { ResponseList statuses = twitter.getUserListStatuses(listId, paging); contentFeed = setStatuses(input.mContentHandle, statuses); } catch (NumberFormatException e) { + }catch (OutOfMemoryError e) { + errorDescription="There was an out of memory doing that!"; } break; } diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index 755de458..adbfd8ff 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -108,6 +108,7 @@ public void addValues(Bundle args) { // accessors private TwitterStatuses _mCachedStatusFeed; private TwitterFetchStatusesFinishedCallback mTweetDataRefreshCallback; + private int mTimesFetchCalled; private TwitterFetchStatusesFinishedCallback mTweetDataLoadMoreCallback; private ViewSwitcher mViewSwitcher; private final ArrayList mSelectedItems = new ArrayList(); @@ -239,6 +240,10 @@ void fetchNewestTweets(final long sinceStatusId, Long maxStatusId) { mTweetFeedListView.setRefreshing(); + if (maxStatusId==null){ + mTimesFetchCalled = 0; + } + if (mTweetDataRefreshCallback == null) { mTweetDataRefreshCallback = new TwitterFetchStatusesFinishedCallback() { @@ -278,13 +283,21 @@ public void finished(TwitterFetchResult fetchResult, TwitterStatuses feed, } Log.d("api-call", "--fetchNewestTweets(" + mContentHandle.getStatusesType().toString() + ")"); - TwitterPaging paging = new TwitterPaging(null, null, sinceStatusId, maxStatusId); + + int pageSize = (TwitterPaging.INCREMENTING_STATUS_COUNT_START * mTimesFetchCalled); + if(pageSize > TwitterPaging.INCREMENTING_STATUS_COUNT_MAX){ + pageSize = TwitterPaging.INCREMENTING_STATUS_COUNT_MAX; + } + + TwitterPaging paging = new TwitterPaging(null, pageSize, sinceStatusId, maxStatusId); TwitterManager.get().triggerFetchStatuses(mContentHandle, paging, mTweetDataRefreshCallback, getAsyncTaskPriorityOffset()); if (!getBaseLaneActivity().isComposing() && !(mSelectedItems == null || mSelectedItems.size() == 0)) { getBaseLaneActivity().finishCurrentActionMode(); } + + mTimesFetchCalled++; } } From 65d520e1fc9ab722bfa84e25ea5b9de168d9e70f Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Tue, 20 Aug 2013 19:50:13 +0100 Subject: [PATCH 078/163] Update change log for #124 --- android/libraries/TweetLanesCore/res/xml/changelog.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/android/libraries/TweetLanesCore/res/xml/changelog.xml b/android/libraries/TweetLanesCore/res/xml/changelog.xml index 85ad211c..098d0ffe 100644 --- a/android/libraries/TweetLanesCore/res/xml/changelog.xml +++ b/android/libraries/TweetLanesCore/res/xml/changelog.xml @@ -6,6 +6,7 @@ Feature - Added "Extra Extra Large" and "Supersize" font sizes Feature - Extended the auto complete to match typed text anywhere in username and in full name Feature - Added ability to remove an attached image by pressing and holding + Feature - Added smarter fetching starting with small pages, and incrementing as extra pages required Fix - Links are now shown in full, rather than a "display link" Fix - Links in profile descriptions converted from t.co links Fix - Reply when loading profile correction. Show "Tweet @username" From 81132c84d203c1236cd97969f32aaba28db8103c Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Tue, 20 Aug 2013 19:52:51 +0100 Subject: [PATCH 079/163] Correct logic to prevent page size of 0. --- .../src/org/tweetalib/android/TwitterPaging.java | 2 +- .../com/tweetlanes/android/core/view/TweetFeedFragment.java | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterPaging.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterPaging.java index c5927f7c..6ae8887c 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterPaging.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/TwitterPaging.java @@ -54,7 +54,7 @@ public TwitterPaging(Integer page, Integer count, Long sinceId, Long maxId) { if (page != null) { mPage = page; } - if (count != null) { + if (count != null && count > 0) { mCount = count; } else { mCount = DEFAULT_STATUS_COUNT; diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index adbfd8ff..323fa3c7 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -282,7 +282,9 @@ public void finished(TwitterFetchResult fetchResult, TwitterStatuses feed, mLastTwitterStatusIdSeen = visibleStatus.mId; } - Log.d("api-call", "--fetchNewestTweets(" + mContentHandle.getStatusesType().toString() + ")"); + mTimesFetchCalled++; + + Log.d("api-call", "--fetchNewestTweets(" + mContentHandle.getStatusesType().toString() + ") --page: " + mTimesFetchCalled); int pageSize = (TwitterPaging.INCREMENTING_STATUS_COUNT_START * mTimesFetchCalled); if(pageSize > TwitterPaging.INCREMENTING_STATUS_COUNT_MAX){ @@ -297,7 +299,7 @@ public void finished(TwitterFetchResult fetchResult, TwitterStatuses feed, getBaseLaneActivity().finishCurrentActionMode(); } - mTimesFetchCalled++; + } } From bb9ef086bd3ce76a6cf6a99665e62c86373c9ae0 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Wed, 21 Aug 2013 06:53:51 +0100 Subject: [PATCH 080/163] Ensure the list heading always shows --- .../android/core/view/TweetFeedFragment.java | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index 323fa3c7..deb192d2 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -160,8 +160,6 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa mTweetFeedListView.setOnRefreshListener(mTweetFeedOnRefreshListener); mTweetFeedListView.setOnLastItemVisibleListener(mTweetFeedOnLastItemVisibleListener); - configureInitialStatuses(); - mRefreshTimestampsHandler.removeCallbacks(mRefreshTimestampsTask); mRefreshTimestampsHandler.postDelayed(mRefreshTimestampsTask, REFRESH_TIMESTAMPS_INTERVAL); @@ -170,7 +168,6 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa LocalBroadcastManager.getInstance(getActivity()) .registerReceiver(mVolumeDownKeyDownReceiver, new IntentFilter("" + SystemEvent.VOLUME_DOWN_KEY_DOWN)); - if (savedInstanceState != null) { mTwitterStatusIdWhenRefreshed = savedInstanceState.containsKey("TwitterStatusIdWhenRefreshed") ? savedInstanceState.getLong("TwitterStatusIdWhenRefreshed") : 0L; mLastTwitterStatusIdSeen = savedInstanceState.containsKey("LastTwitterStatusIdSeen") ? savedInstanceState.getLong("LastTwitterStatusIdSeen") : 0L; @@ -178,6 +175,8 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa mHidingListHeading = savedInstanceState.getBoolean("HidingListHeading", false); } + configureInitialStatuses(); + return resultView; } @@ -240,7 +239,7 @@ void fetchNewestTweets(final long sinceStatusId, Long maxStatusId) { mTweetFeedListView.setRefreshing(); - if (maxStatusId==null){ + if (maxStatusId == null) { mTimesFetchCalled = 0; } @@ -287,7 +286,7 @@ public void finished(TwitterFetchResult fetchResult, TwitterStatuses feed, Log.d("api-call", "--fetchNewestTweets(" + mContentHandle.getStatusesType().toString() + ") --page: " + mTimesFetchCalled); int pageSize = (TwitterPaging.INCREMENTING_STATUS_COUNT_START * mTimesFetchCalled); - if(pageSize > TwitterPaging.INCREMENTING_STATUS_COUNT_MAX){ + if (pageSize > TwitterPaging.INCREMENTING_STATUS_COUNT_MAX) { pageSize = TwitterPaging.INCREMENTING_STATUS_COUNT_MAX; } @@ -540,7 +539,7 @@ public void onReceive(Context context, Intent intent) { }; /* - * + * */ enum ScrollDirection { UNKNOWN, @@ -756,16 +755,13 @@ void updateListHeading(int firstVisibleItem) { mLastTwitterStatusIdSeen = status.mId; } - if (mNewStatuses > 0) - { + if (mNewStatuses > 0) { setListHeadingVisiblilty(View.VISIBLE); mListHeadingTextView.setText(mNewStatuses + " " + getString(mNewStatuses == 1 ? socialNetType == SocialNetConstant.Type.Twitter ? R.string.new_tweet : R.string.new_post : socialNetType == SocialNetConstant.Type.Twitter ? R.string.new_tweets : R.string.new_posts)); - } - else - { + } else { setListHeadingVisiblilty(View.GONE); mTwitterStatusIdWhenRefreshed = null; } @@ -854,7 +850,7 @@ private void onRefreshFinished(TwitterFetchResult result, TwitterStatuses feed) if (statusIndex != null) { mTweetFeedListView.getRefreshableView() - .setSelectionFromTop(statusIndex.intValue(), mScrollTracker.getFirstVisibleYOffset()); + .setSelectionFromTop(statusIndex.intValue() + 1, mScrollTracker.getFirstVisibleYOffset()); int total = getStatusFeed().getStatusCount(); int newStatuses = 0; @@ -871,6 +867,8 @@ private void onRefreshFinished(TwitterFetchResult result, TwitterStatuses feed) } mNewStatuses = newStatuses; + + updateListHeading(statusIndex.intValue() + 1); } else { showToast(getString(R.string.lost_position)); } From d4d48a711c861610c7ad361aae12637981e68c49 Mon Sep 17 00:00:00 2001 From: Jason Famularo Date: Wed, 21 Aug 2013 21:22:08 -0400 Subject: [PATCH 081/163] Fix for notifications not opening correct lane. --- .../src/com/tweetlanes/android/core/view/HomeActivity.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java index 88562d4c..7caa5289 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java @@ -88,8 +88,6 @@ public class HomeActivity extends BaseLaneActivity { @Override protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - AccountDescriptor account = getApp().getCurrentAccount(); Bundle extras = getIntent().getExtras(); @@ -130,6 +128,8 @@ protected void onCreate(Bundle savedInstanceState) { } } + super.onCreate(savedInstanceState); + // Attempt at fixing a crash found in HomeActivity if (account == null) { Toast.makeText(getApplicationContext(), @@ -305,7 +305,7 @@ protected int getInitialLaneIndex() { AccountDescriptor account = getApp().getCurrentAccount(); if (mDefaultLaneOverride != null) { - int lane = mDefaultLaneOverride.intValue(); + int lane = mDefaultLaneOverride; mDefaultLaneOverride = null; return lane; } From c56e0c1351f4a211ef7eb479411963fdf5150d81 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Thu, 22 Aug 2013 06:48:56 +0100 Subject: [PATCH 082/163] Increase number of status' that get cached. On larger screen devices this will prevent the loading more at the bottom straight away (As i get on my HTC One S) --- .../com/tweetlanes/android/core/view/TweetFeedFragment.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index deb192d2..fd5bf37e 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -375,11 +375,11 @@ public String getDataToCache() { // View view = (View)listView.getItemAtPosition(visible); - int startIndex = Math.max(0, visibleIndex - 5); + int startIndex = Math.max(0, visibleIndex - 10); // int endIndex = Math.min(visibleIndex + 5, // Math.min(getStatusFeed().getStatusCount(), // mTweetFeedListAdapter.getCount())); - int endIndex = Math.min(visibleIndex + 5, feed.getStatusCount()); + int endIndex = Math.min(visibleIndex + 10, feed.getStatusCount()); Long visibleStatusId = null; From ee28845cf59c0b9158fa2add734125e047ef4903 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Thu, 22 Aug 2013 07:07:48 +0100 Subject: [PATCH 083/163] Move logic for repositioning status feed to the place where the status feed is reordered --- .../android/core/view/TweetFeedFragment.java | 64 +++++++++---------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index fd5bf37e..cc1a3dfc 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -271,6 +271,7 @@ public void finished(TwitterFetchResult fetchResult, TwitterStatuses feed, fetchNewestTweets(sinceStatusId, feed.getNewStatusesMaxId()); } } else { + showToast(fetchResult.getErrorMessage()); onRefreshFinished(fetchResult, null); } } @@ -548,7 +549,7 @@ enum ScrollDirection { } /* - * + * */ private class ScrollTracker { @@ -831,8 +832,6 @@ private void onRefreshFinished(TwitterFetchResult result, TwitterStatuses feed) return; } - TwitterStatus visibleStatus = getVisibleStatus(); - if (feed != null) { setStatusFeed(feed, true); } @@ -840,39 +839,18 @@ private void onRefreshFinished(TwitterFetchResult result, TwitterStatuses feed) mTweetFeedListView.onRefreshComplete(); mTweetFeedListAdapter.notifyDataSetChanged(); - Integer statusIndex = null; - - if (visibleStatus != null) { - statusIndex = getStatusFeed().getStatusIndex(visibleStatus.mId); - } else if (mLastTwitterStatusIdSeen != null) { - statusIndex = getStatusFeed().getStatusIndex(mLastTwitterStatusIdSeen); - } - - if (statusIndex != null) { - mTweetFeedListView.getRefreshableView() - .setSelectionFromTop(statusIndex.intValue() + 1, mScrollTracker.getFirstVisibleYOffset()); - - int total = getStatusFeed().getStatusCount(); - int newStatuses = 0; + int total = getStatusFeed().getStatusCount(); + int newStatuses = 0; - if (visibleStatus != null && mLastTwitterStatusIdSeen < visibleStatus.mId) { - mLastTwitterStatusIdSeen = visibleStatus.mId; + for (int i = 0; i < total; i++) { + TwitterStatus status = getStatusFeed().getStatus(i); + if (status != null && status.mId > mLastTwitterStatusIdSeen) { + newStatuses++; } - - for (int i = 0; i < total; i++) { - TwitterStatus status = getStatusFeed().getStatus(i); - if (status != null && status.mId > mLastTwitterStatusIdSeen) { - newStatuses++; - } - } - - mNewStatuses = newStatuses; - - updateListHeading(statusIndex.intValue() + 1); - } else { - showToast(getString(R.string.lost_position)); } + mNewStatuses = newStatuses; + mTweetDataRefreshCallback = null; } @@ -1029,6 +1007,7 @@ private void setStatusFeed(TwitterStatuses statuses, boolean addCachedStatuses) mNewestTweetId = null; mOldestTweetId = null; + TwitterStatus visibleStatus = getVisibleStatus(); if (statuses == null) { _mStatusFeed = null; @@ -1043,6 +1022,27 @@ private void setStatusFeed(TwitterStatuses statuses, boolean addCachedStatuses) if (_mStatusFeed != null && _mStatusFeed.getStatusCount() > 0) { mNewestTweetId = _mStatusFeed.getStatus(0).mId; mOldestTweetId = _mStatusFeed.getStatus(_mStatusFeed.getStatusCount() - 1).mId; + + Integer statusIndex = null; + + if (visibleStatus != null) { + statusIndex = getStatusFeed().getStatusIndex(visibleStatus.mId); + } else if (mLastTwitterStatusIdSeen != null) { + statusIndex = getStatusFeed().getStatusIndex(mLastTwitterStatusIdSeen); + } + + if (statusIndex != null) { + mTweetFeedListView.getRefreshableView() + .setSelectionFromTop(statusIndex.intValue() + 1, mScrollTracker.getFirstVisibleYOffset()); + + if (visibleStatus != null && mLastTwitterStatusIdSeen < visibleStatus.mId) { + mLastTwitterStatusIdSeen = visibleStatus.mId; + } + + updateListHeading(statusIndex.intValue() + 1); + } else { + showToast(getString(R.string.lost_position)); + } } } From b66de329df769f923943daa7f6db5c6ff4e9cf39 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Thu, 22 Aug 2013 07:32:11 +0100 Subject: [PATCH 084/163] Change logic for locating a tweet in the status feed & only doing a reposition if the feed has status' beforehand --- .../android/model/TwitterStatuses.java | 6 ++- .../android/core/view/TweetFeedFragment.java | 41 ++++++++++--------- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatuses.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatuses.java index b1c3fcf3..4909646f 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatuses.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatuses.java @@ -447,8 +447,12 @@ public Integer getStatusIndex(long statusId) { high = middle - 1; } else if (statusId < status.mId) { low = middle + 1; - } else { // The element has been found + } else if (statusId == status.mId){ + // The element has been found return middle; + } else{ + // Couldn't find the element + break; } } diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index cc1a3dfc..ae72d33f 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -184,13 +184,10 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa public void onSaveInstanceState(Bundle state) { super.onSaveInstanceState(state); - if (mTwitterStatusIdWhenRefreshed != null) - state.putLong("TwitterStatusIdWhenRefreshed", mTwitterStatusIdWhenRefreshed); - if (mLastTwitterStatusIdSeen != null) - state.putLong("LastTwitterStatusIdSeen", mLastTwitterStatusIdSeen); + state.putLong("TwitterStatusIdWhenRefreshed", mTwitterStatusIdWhenRefreshed); + state.putLong("LastTwitterStatusIdSeen", mLastTwitterStatusIdSeen); state.putInt("NewStatuses", mNewStatuses); state.putBoolean("HidingListHeading", mHidingListHeading); - } /* @@ -1008,6 +1005,7 @@ private void setStatusFeed(TwitterStatuses statuses, boolean addCachedStatuses) mNewestTweetId = null; mOldestTweetId = null; TwitterStatus visibleStatus = getVisibleStatus(); + boolean statusPresentAtStart = _mStatusFeed != null && _mStatusFeed.getStatusCount() > 0; if (statuses == null) { _mStatusFeed = null; @@ -1023,25 +1021,28 @@ private void setStatusFeed(TwitterStatuses statuses, boolean addCachedStatuses) mNewestTweetId = _mStatusFeed.getStatus(0).mId; mOldestTweetId = _mStatusFeed.getStatus(_mStatusFeed.getStatusCount() - 1).mId; - Integer statusIndex = null; + if(statusPresentAtStart) + { + Integer statusIndex = null; - if (visibleStatus != null) { - statusIndex = getStatusFeed().getStatusIndex(visibleStatus.mId); - } else if (mLastTwitterStatusIdSeen != null) { - statusIndex = getStatusFeed().getStatusIndex(mLastTwitterStatusIdSeen); - } + if (visibleStatus != null) { + statusIndex = getStatusFeed().getStatusIndex(visibleStatus.mId); + } else if (mLastTwitterStatusIdSeen != null && mLastTwitterStatusIdSeen > 0) { + statusIndex = getStatusFeed().getStatusIndex(mLastTwitterStatusIdSeen); + } - if (statusIndex != null) { - mTweetFeedListView.getRefreshableView() - .setSelectionFromTop(statusIndex.intValue() + 1, mScrollTracker.getFirstVisibleYOffset()); + if (statusIndex != null) { + mTweetFeedListView.getRefreshableView() + .setSelectionFromTop(statusIndex.intValue() + 1, mScrollTracker.getFirstVisibleYOffset()); - if (visibleStatus != null && mLastTwitterStatusIdSeen < visibleStatus.mId) { - mLastTwitterStatusIdSeen = visibleStatus.mId; - } + if (visibleStatus != null && mLastTwitterStatusIdSeen < visibleStatus.mId) { + mLastTwitterStatusIdSeen = visibleStatus.mId; + } - updateListHeading(statusIndex.intValue() + 1); - } else { - showToast(getString(R.string.lost_position)); + updateListHeading(statusIndex.intValue() + 1); + } else { + showToast(getString(R.string.lost_position)); + } } } } From 6e3f75897306f5656949a01d7c55e534dbc573b0 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Thu, 22 Aug 2013 07:45:30 +0100 Subject: [PATCH 085/163] Reverting some of the reorganistation as it didn't work - in fact made things worse --- .../TweetLanesCore/res/values/strings.xml | 1 + .../android/core/view/TweetFeedFragment.java | 91 ++++++++++--------- 2 files changed, 48 insertions(+), 44 deletions(-) diff --git a/android/libraries/TweetLanesCore/res/values/strings.xml b/android/libraries/TweetLanesCore/res/values/strings.xml index 263f8c71..225b8daa 100644 --- a/android/libraries/TweetLanesCore/res/values/strings.xml +++ b/android/libraries/TweetLanesCore/res/values/strings.xml @@ -175,6 +175,7 @@ Posting Posting … The position on the feed has been lost + The refresh was cancelled to stop position being lost Tweet Text Link to Tweet diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index ae72d33f..9dfff955 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -236,11 +236,16 @@ void fetchNewestTweets(final long sinceStatusId, Long maxStatusId) { mTweetFeedListView.setRefreshing(); - if (maxStatusId == null) { - mTimesFetchCalled = 0; - } - if (mTweetDataRefreshCallback == null) { + + if (maxStatusId == null) { + mTimesFetchCalled = 0; + TwitterStatus visibleStatus = getVisibleStatus(); + if (visibleStatus != null && mLastTwitterStatusIdSeen < visibleStatus.mId) { + mLastTwitterStatusIdSeen = visibleStatus.mId; + } + } + mTweetDataRefreshCallback = new TwitterFetchStatusesFinishedCallback() { @Override @@ -263,20 +268,20 @@ public void finished(TwitterFetchResult fetchResult, TwitterStatuses feed, if (doneGettingStatus) { beginListHeadingCount(); - onRefreshFinished(fetchResult, feed); + onRefreshFinished(feed); } else { fetchNewestTweets(sinceStatusId, feed.getNewStatusesMaxId()); } } else { showToast(fetchResult.getErrorMessage()); - onRefreshFinished(fetchResult, null); + onRefreshFinished(null); } } }; - TwitterStatus visibleStatus = getVisibleStatus(); - if (visibleStatus != null && mLastTwitterStatusIdSeen < visibleStatus.mId) { - mLastTwitterStatusIdSeen = visibleStatus.mId; + if(mLastTwitterStatusIdSeen == null || mLastTwitterStatusIdSeen == 0){ + showToast(getString(R.string.pottential_lost_position)); + onRefreshFinished(null); } mTimesFetchCalled++; @@ -823,18 +828,42 @@ private TwitterStatus getVisibleStatus() { /* * */ - private void onRefreshFinished(TwitterFetchResult result, TwitterStatuses feed) { + private void onRefreshFinished(TwitterStatuses feed) { - if (mTweetFeedListView == null || mTweetFeedListView.getRefreshableView() == null) { - return; - } + if (mTweetFeedListView == null || mTweetFeedListView.getRefreshableView() == null) { + return; + } - if (feed != null) { - setStatusFeed(feed, true); - } + TwitterStatus visibleStatus = getVisibleStatus(); + + if (feed != null) { + setStatusFeed(feed, true); + } + + mTweetFeedListView.onRefreshComplete(); + mTweetFeedListAdapter.notifyDataSetChanged(); + + + Integer statusIndex = null; + + if (visibleStatus != null) { + statusIndex = getStatusFeed().getStatusIndex(visibleStatus.mId); + } else if (mLastTwitterStatusIdSeen != null && mLastTwitterStatusIdSeen > 0) { + statusIndex = getStatusFeed().getStatusIndex(mLastTwitterStatusIdSeen); + } + + if (statusIndex != null) { + mTweetFeedListView.getRefreshableView() + .setSelectionFromTop(statusIndex.intValue() + 1, mScrollTracker.getFirstVisibleYOffset()); + + if (visibleStatus != null && mLastTwitterStatusIdSeen < visibleStatus.mId) { + mLastTwitterStatusIdSeen = visibleStatus.mId; + } - mTweetFeedListView.onRefreshComplete(); - mTweetFeedListAdapter.notifyDataSetChanged(); + updateListHeading(statusIndex.intValue() + 1); + } else { + showToast(getString(R.string.lost_position)); + } int total = getStatusFeed().getStatusCount(); int newStatuses = 0; @@ -1004,8 +1033,6 @@ private void setStatusFeed(TwitterStatuses statuses, boolean addCachedStatuses) mNewestTweetId = null; mOldestTweetId = null; - TwitterStatus visibleStatus = getVisibleStatus(); - boolean statusPresentAtStart = _mStatusFeed != null && _mStatusFeed.getStatusCount() > 0; if (statuses == null) { _mStatusFeed = null; @@ -1020,30 +1047,6 @@ private void setStatusFeed(TwitterStatuses statuses, boolean addCachedStatuses) if (_mStatusFeed != null && _mStatusFeed.getStatusCount() > 0) { mNewestTweetId = _mStatusFeed.getStatus(0).mId; mOldestTweetId = _mStatusFeed.getStatus(_mStatusFeed.getStatusCount() - 1).mId; - - if(statusPresentAtStart) - { - Integer statusIndex = null; - - if (visibleStatus != null) { - statusIndex = getStatusFeed().getStatusIndex(visibleStatus.mId); - } else if (mLastTwitterStatusIdSeen != null && mLastTwitterStatusIdSeen > 0) { - statusIndex = getStatusFeed().getStatusIndex(mLastTwitterStatusIdSeen); - } - - if (statusIndex != null) { - mTweetFeedListView.getRefreshableView() - .setSelectionFromTop(statusIndex.intValue() + 1, mScrollTracker.getFirstVisibleYOffset()); - - if (visibleStatus != null && mLastTwitterStatusIdSeen < visibleStatus.mId) { - mLastTwitterStatusIdSeen = visibleStatus.mId; - } - - updateListHeading(statusIndex.intValue() + 1); - } else { - showToast(getString(R.string.lost_position)); - } - } } } From 06dda3ca0d6f6e4b8f50a54305e9530cdf2cce32 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Thu, 22 Aug 2013 07:54:51 +0100 Subject: [PATCH 086/163] Ensure new status' number is updated before showing list heading --- .../android/core/view/TweetFeedFragment.java | 65 +++++++++---------- 1 file changed, 32 insertions(+), 33 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index 9dfff955..5e113fe3 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -279,7 +279,7 @@ public void finished(TwitterFetchResult fetchResult, TwitterStatuses feed, } }; - if(mLastTwitterStatusIdSeen == null || mLastTwitterStatusIdSeen == 0){ + if (mLastTwitterStatusIdSeen == null || mLastTwitterStatusIdSeen == 0) { showToast(getString(R.string.pottential_lost_position)); onRefreshFinished(null); } @@ -611,7 +611,7 @@ ScrollDirection getLastScrollDirection() { private final ScrollTracker mScrollTracker = new ScrollTracker(); /* - * + * */ private final OnScrollListener mTweetFeedOnScrollListener = new OnScrollListener() { @@ -830,41 +830,19 @@ private TwitterStatus getVisibleStatus() { */ private void onRefreshFinished(TwitterStatuses feed) { - if (mTweetFeedListView == null || mTweetFeedListView.getRefreshableView() == null) { - return; - } - - TwitterStatus visibleStatus = getVisibleStatus(); - - if (feed != null) { - setStatusFeed(feed, true); - } - - mTweetFeedListView.onRefreshComplete(); - mTweetFeedListAdapter.notifyDataSetChanged(); - - - Integer statusIndex = null; - - if (visibleStatus != null) { - statusIndex = getStatusFeed().getStatusIndex(visibleStatus.mId); - } else if (mLastTwitterStatusIdSeen != null && mLastTwitterStatusIdSeen > 0) { - statusIndex = getStatusFeed().getStatusIndex(mLastTwitterStatusIdSeen); - } - - if (statusIndex != null) { - mTweetFeedListView.getRefreshableView() - .setSelectionFromTop(statusIndex.intValue() + 1, mScrollTracker.getFirstVisibleYOffset()); + if (mTweetFeedListView == null || mTweetFeedListView.getRefreshableView() == null) { + return; + } - if (visibleStatus != null && mLastTwitterStatusIdSeen < visibleStatus.mId) { - mLastTwitterStatusIdSeen = visibleStatus.mId; - } + TwitterStatus visibleStatus = getVisibleStatus(); - updateListHeading(statusIndex.intValue() + 1); - } else { - showToast(getString(R.string.lost_position)); + if (feed != null) { + setStatusFeed(feed, true); } + mTweetFeedListView.onRefreshComplete(); + mTweetFeedListAdapter.notifyDataSetChanged(); + int total = getStatusFeed().getStatusCount(); int newStatuses = 0; @@ -877,6 +855,27 @@ private void onRefreshFinished(TwitterStatuses feed) { mNewStatuses = newStatuses; + Integer statusIndex = null; + + if (visibleStatus != null) { + statusIndex = getStatusFeed().getStatusIndex(visibleStatus.mId); + } else if (mLastTwitterStatusIdSeen != null && mLastTwitterStatusIdSeen > 0) { + statusIndex = getStatusFeed().getStatusIndex(mLastTwitterStatusIdSeen); + } + + if (statusIndex != null) { + mTweetFeedListView.getRefreshableView() + .setSelectionFromTop(statusIndex.intValue() + 1, mScrollTracker.getFirstVisibleYOffset()); + + if (visibleStatus != null && mLastTwitterStatusIdSeen < visibleStatus.mId) { + mLastTwitterStatusIdSeen = visibleStatus.mId; + } + + updateListHeading(statusIndex.intValue() + 1); + } else { + showToast(getString(R.string.lost_position)); + } + mTweetDataRefreshCallback = null; } From 6fb965ec47311149db9ae074f997cb222510399e Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Thu, 22 Aug 2013 07:56:53 +0100 Subject: [PATCH 087/163] Re-Add null check on adding to saved instance --- .../tweetlanes/android/core/view/TweetFeedFragment.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index 5e113fe3..b4c20bdd 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -184,8 +184,12 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa public void onSaveInstanceState(Bundle state) { super.onSaveInstanceState(state); - state.putLong("TwitterStatusIdWhenRefreshed", mTwitterStatusIdWhenRefreshed); - state.putLong("LastTwitterStatusIdSeen", mLastTwitterStatusIdSeen); + if(mTwitterStatusIdWhenRefreshed != null) + state.putLong("TwitterStatusIdWhenRefreshed", mTwitterStatusIdWhenRefreshed); + + if(mLastTwitterStatusIdSeen != null) + state.putLong("LastTwitterStatusIdSeen", mLastTwitterStatusIdSeen); + state.putInt("NewStatuses", mNewStatuses); state.putBoolean("HidingListHeading", mHidingListHeading); } From 53b7d8398bb83cb0c086c4bd0c84b6d70055d1d1 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Fri, 23 Aug 2013 06:47:28 +0100 Subject: [PATCH 088/163] Fix for #244 correct the way the current visible status is worked out --- .../android/core/view/TweetFeedFragment.java | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index b4c20bdd..54d93b5f 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -388,7 +388,6 @@ public String getDataToCache() { // mTweetFeedListAdapter.getCount())); int endIndex = Math.min(visibleIndex + 10, feed.getStatusCount()); - Long visibleStatusId = null; TwitterStatuses statuses = new TwitterStatuses(); for (int i = startIndex; i < endIndex; i++) { @@ -397,15 +396,24 @@ public String getDataToCache() { break; } - if (i == visibleIndex) { - visibleStatusId = status.mId; - // Log.d("StatusCache", "Set visible: " + - // status.getStatus()); - } - statuses.add(status); } + Long visibleStatusId = null; + TwitterStatus visibleStatus = getVisibleStatus(); + if(visibleStatus!=null){ + visibleStatusId=visibleStatus.mId; + }else if(mLastTwitterStatusIdSeen!=null && mLastTwitterStatusIdSeen > 0){ + visibleStatusId = mLastTwitterStatusIdSeen; + } + + if(visibleStatusId!= null){ + if (statuses.getStatusIndex(visibleStatusId)==null){ + int index = feed.getStatusIndex(visibleStatusId); + statuses.add(feed.getStatus(index)); + } + } + if (statuses.getStatusCount() > 0 && visibleStatusId != null) { JSONObject object = new JSONObject(); try { From 0d99b31108bf632ac921d8e92b7ad41f20990c81 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Fri, 23 Aug 2013 07:04:23 +0100 Subject: [PATCH 089/163] Fix for #243 change the user url entities to include the actual url and change profile to get markup using the entities. --- .../tweetalib/android/model/TwitterUser.java | 26 +++++++++++++------ .../android/core/view/ProfileFragment.java | 24 ++++++++--------- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterUser.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterUser.java index f00148dc..ebb2f2ab 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterUser.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterUser.java @@ -15,6 +15,9 @@ import org.socialnetlib.android.SocialNetConstant; import org.tweetalib.android.TwitterManager.ProfileImageSize; +import java.util.ArrayList; +import java.util.Arrays; + import twitter4j.URLEntity; import twitter4j.User; @@ -25,16 +28,22 @@ public TwitterUser(User user) { mScreenName = user.getScreenName(); mName = user.getName(); mDescription = user.getDescription(); + ArrayList urlEntityArrayList = new ArrayList(); if (user.getDescriptionURLEntities() != null) { - mDescriptionUrlEntities = user.getDescriptionURLEntities(); + urlEntityArrayList = new ArrayList(Arrays.asList(user.getDescriptionURLEntities())); + } + + if (user.getURL() != null) { + mUrl = user.getURL(); + urlEntityArrayList.add(user.getURLEntity()); } + + mUrlEntities = urlEntityArrayList.toArray(new URLEntity[urlEntityArrayList.size()]); + if (user.getLocation() != null && !user.getLocation().equals("")) { mLocation = user.getLocation(); } - if (user.getURL() != null) { - mUrl = user.getURL(); - } if (user.getOriginalProfileImageURLHttps() != null) { mProfileImageUrlOriginal = user.getOriginalProfileImageURLHttps(); @@ -86,9 +95,10 @@ public TwitterUser(TwitterUser user) { mScreenName = user.getScreenName(); mName = user.getName(); mDescription = user.getDescription(); - mDescriptionUrlEntities = user.getDescriptionUrlEntities(); + mUrlEntities = user.getUrlEntities(); mLocation = user.getLocation(); mUrl = user.getUrl(); + mProfileImageUrlMini = user.getProfileImageUrlMini(); mProfileImageUrlNormal = user.getProfileImageUrlNormal(); mProfileImageUrlBigger = user.getProfileImageUrlBigger(); @@ -203,15 +213,15 @@ public String getProfileImageUrl(ProfileImageSize size) { return ""; } - public URLEntity[] getDescriptionUrlEntities() { - return mDescriptionUrlEntities; + public URLEntity[] getUrlEntities() { + return mUrlEntities; } private final long mId; private final String mScreenName; private final String mName; private final String mDescription; - private URLEntity[] mDescriptionUrlEntities; + private URLEntity[] mUrlEntities; private String mCoverImageUrl; private String mLocation; private String mProfileImageUrlMini; diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ProfileFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ProfileFragment.java index d5c2e0b6..8ac9412f 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ProfileFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ProfileFragment.java @@ -237,7 +237,7 @@ void configureView() { } String description = mUser.getDescription(); - URLEntity[] urlEntities = mUser.getDescriptionUrlEntities(); + URLEntity[] urlEntities = mUser.getUrlEntities(); if (description != null) { String descriptionMarkup = TwitterUtil.getTextMarkup(description, urlEntities); descriptionTextView.setText(Html.fromHtml(descriptionMarkup @@ -247,6 +247,16 @@ void configureView() { URLSpanNoUnderline.stripUnderlines(descriptionTextView); } + if (mUser.getUrl() != null) { + linkLayout.setVisibility(View.VISIBLE); + String urlMarkup = TwitterUtil.getTextMarkup(mUser.getUrl(), urlEntities); + link.setText(Html.fromHtml(urlMarkup + "")); + link.setMovementMethod(LinkMovementMethod.getInstance()); + URLSpanNoUnderline.stripUnderlines(link); + } else { + linkLayout.setVisibility(View.GONE); + } + detailsLayout.setVisibility(View.VISIBLE); privateAccountImage .setVisibility(mUser.getProtected() ? View.VISIBLE @@ -262,18 +272,6 @@ void configureView() { .getFavoritesCount())); } - if (mUser.getUrl() != null) { - linkLayout.setVisibility(View.VISIBLE); - // link.setText(mUser.getUrl()); - // URLSpanNoUnderline.stripUnderlines(link); - link.setText(Html.fromHtml("
    " + mUser.getUrl() + "")); - link.setMovementMethod(LinkMovementMethod.getInstance()); - URLSpanNoUnderline.stripUnderlines(link); - } else { - linkLayout.setVisibility(View.GONE); - } - if (mUser.getLocation() != null) { locationLayout.setVisibility(View.VISIBLE); location.setText(mUser.getLocation()); From f17bd5641f1e0a96ccb90a2f516393b285b50d13 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Fri, 23 Aug 2013 07:07:09 +0100 Subject: [PATCH 090/163] Update change log --- .../libraries/TweetLanesCore/res/xml/changelog.xml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/android/libraries/TweetLanesCore/res/xml/changelog.xml b/android/libraries/TweetLanesCore/res/xml/changelog.xml index 66bf7c8f..90c5a949 100644 --- a/android/libraries/TweetLanesCore/res/xml/changelog.xml +++ b/android/libraries/TweetLanesCore/res/xml/changelog.xml @@ -8,16 +8,18 @@ Feature - Added ability to remove an attached image by pressing and holding Feature - Added URL handling so that Tweetlanes is a choice when loading Twitter or App.net items Feature - Added smarter fetching starting with small pages, and incrementing as extra pages required - Fix - Links are now shown in full, rather than a "display link" + Fix - Links are now shown in full, rather than a "display link" Fix - Links in profile descriptions converted from t.co links Fix - Reply when loading profile correction. Show "Tweet @username" - Fix - Correct issues around compose box after loading profile - Fix - Use the t.co display url, rather than expanded url. These are formatted nicer - Fix - Fix issue when more than 1 page of tweets. Fetch only completes when all tweets collected preventing feed jumping + Fix - Correct issues around compose box after loading profile + Fix - Use the t.co display url, rather than expanded url. These are formatted nicer + Fix - Fix issue when more than 1 page of tweets. Fetch only completes when all tweets collected preventing feed jumping Fix - Change the message when you try and send an empty status update Fix - Correct issue with the new tweet bar when orientation changes and account switches Fix - Profile and service icon only show when you use both networks, or have 3 or more accounts - Other - Large codebase tidy-up - hopefully small improvement to performance, size and reliability + Fix - Position in lanes remembered between loads and lane switches + Fix - Profile URL is now expanded from a t.co + Other - Large codebase tidy-up - hopefully small improvement to performance, size and reliability Feature - Auto complete of @mentions and #hashtags From 33eaa7e05eebaa252a17b8f734ba65c640733043 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Fri, 23 Aug 2013 08:44:14 +0100 Subject: [PATCH 091/163] Get the old index before changing lanes and then pass the correct old position through --- .../com/tweetlanes/android/core/view/BaseLaneActivity.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java index 0a9f5ed5..eea73744 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java @@ -717,6 +717,9 @@ public void onPageSelected(int position) { && mLaneFragmentHashMap.containsKey(position)) { } + + int oldPosition = getApp().getCurrentAccount().getInitialLaneIndex(); + getApp().getCurrentAccount().setCurrentLaneIndex(position); if (mCurrentActionMode != null) { // TODO: Probably shouldn't clear this in the event the @@ -724,7 +727,7 @@ public void onPageSelected(int position) { mCurrentActionMode.finish(); } - onLaneChange(position, -1); + onLaneChange(position, oldPosition); } }; From 3d80c7392cce4eb16cadf3079f777266209aa134 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Fri, 23 Aug 2013 09:17:37 +0100 Subject: [PATCH 092/163] Fix for #95 added a refresh after sending in a status and also when loading the app from a notification therefore your mention/DM will be loading straight away --- .../TweetLanesCore/res/xml/changelog.xml | 1 + .../android/core/view/BaseLaneActivity.java | 15 +++++++++++++++ .../android/core/view/BaseLaneFragment.java | 2 ++ .../android/core/view/TweetFeedFragment.java | 5 ++++- 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/android/libraries/TweetLanesCore/res/xml/changelog.xml b/android/libraries/TweetLanesCore/res/xml/changelog.xml index 90c5a949..695424d9 100644 --- a/android/libraries/TweetLanesCore/res/xml/changelog.xml +++ b/android/libraries/TweetLanesCore/res/xml/changelog.xml @@ -8,6 +8,7 @@ Feature - Added ability to remove an attached image by pressing and holding Feature - Added URL handling so that Tweetlanes is a choice when loading Twitter or App.net items Feature - Added smarter fetching starting with small pages, and incrementing as extra pages required + Feature - Added refresh after posting & refresh when loading app from notification Fix - Links are now shown in full, rather than a "display link" Fix - Links in profile descriptions converted from t.co links Fix - Reply when loading profile correction. Show "Tweet @username" diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java index eea73744..e08362d2 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java @@ -154,6 +154,11 @@ public void onCurrentItemClicked() { mPageIndicator.setViewPager(mViewPager, initialLaneIndex); mPageIndicator.setOnPageChangeListener(mOnPageChangeListener); + + BaseLaneFragment fragment = getFragmentAtIndex(initialLaneIndex); + if(fragment!=null){ + fragment.fetchNewestTweets(); + } } mLaneMask = findViewById(R.id.lane_mask); @@ -551,6 +556,11 @@ public void onStatusUpdateRequest() { public void onStatusUpdateSuccess() { setComposeDefault(); mShareImagePath = null; + int position = getApp().getCurrentAccount().getInitialLaneIndex(); + BaseLaneFragment fragment = getFragmentAtIndex(position); + if(fragment!=null){ + fragment.fetchNewestTweets(); + } } @Override @@ -648,6 +658,11 @@ public void onStatusUpdateRequest() { @Override public void onStatusUpdateSuccess() { setComposeDefault(); + int position = getApp().getCurrentAccount().getInitialLaneIndex(); + BaseLaneFragment fragment = getFragmentAtIndex(position); + if(fragment!=null){ + fragment.fetchNewestTweets(); + } } @Override diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneFragment.java index d8f7d2fa..d14b01e4 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneFragment.java @@ -83,6 +83,8 @@ public int getLaneIndex() { return getArguments().getInt(KEY_LANE_INDEX); } + public void fetchNewestTweets(){} + /* * */ diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index 54d93b5f..11a9d60f 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -227,7 +227,10 @@ private void configureInitialStatuses() { /* * */ - void fetchNewestTweets() { + @Override + public void fetchNewestTweets() { + super.fetchNewestTweets(); + if (mNewestTweetId != null) { fetchNewestTweets(mNewestTweetId.longValue(), null); } From 6d8dbf61efb71b70dd7803d1a2fd6b36faf5a0be Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Fri, 23 Aug 2013 09:21:13 +0100 Subject: [PATCH 093/163] Correct change log --- android/libraries/TweetLanesCore/res/xml/changelog.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/libraries/TweetLanesCore/res/xml/changelog.xml b/android/libraries/TweetLanesCore/res/xml/changelog.xml index 695424d9..563260ab 100644 --- a/android/libraries/TweetLanesCore/res/xml/changelog.xml +++ b/android/libraries/TweetLanesCore/res/xml/changelog.xml @@ -8,7 +8,7 @@ Feature - Added ability to remove an attached image by pressing and holding Feature - Added URL handling so that Tweetlanes is a choice when loading Twitter or App.net items Feature - Added smarter fetching starting with small pages, and incrementing as extra pages required - Feature - Added refresh after posting & refresh when loading app from notification + Feature - Added refresh after posting & refresh when loading app from notification Fix - Links are now shown in full, rather than a "display link" Fix - Links in profile descriptions converted from t.co links Fix - Reply when loading profile correction. Show "Tweet @username" From 542570bc5c85c21359bffd67f7f2365538a36ff3 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Fri, 23 Aug 2013 14:27:14 +0100 Subject: [PATCH 094/163] Change previous fix. Put this code into the wrong activity --- .../com/tweetlanes/android/core/view/BaseLaneActivity.java | 5 ----- .../src/com/tweetlanes/android/core/view/HomeActivity.java | 5 +++++ 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java index e08362d2..60545bbd 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java @@ -154,11 +154,6 @@ public void onCurrentItemClicked() { mPageIndicator.setViewPager(mViewPager, initialLaneIndex); mPageIndicator.setOnPageChangeListener(mOnPageChangeListener); - - BaseLaneFragment fragment = getFragmentAtIndex(initialLaneIndex); - if(fragment!=null){ - fragment.fetchNewestTweets(); - } } mLaneMask = findViewById(R.id.lane_mask); diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java index 7caa5289..912a3e1c 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java @@ -126,6 +126,11 @@ protected void onCreate(Bundle savedInstanceState) { mDefaultLaneOverride = index; } } + + BaseLaneFragment fragment = getFragmentAtIndex(mDefaultLaneOverride); + if(fragment!=null){ + fragment.fetchNewestTweets(); + } } super.onCreate(savedInstanceState); From b9dfb6f820c56a03321d6151f3f03ed79749dd6c Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Fri, 23 Aug 2013 16:23:39 +0100 Subject: [PATCH 095/163] Remove some of the refresh logic (first attempt) --- .../android/core/view/HomeActivity.java | 5 ----- .../android/core/view/TweetFeedFragment.java | 22 ++++++++----------- 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java index 912a3e1c..7caa5289 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/HomeActivity.java @@ -126,11 +126,6 @@ protected void onCreate(Bundle savedInstanceState) { mDefaultLaneOverride = index; } } - - BaseLaneFragment fragment = getFragmentAtIndex(mDefaultLaneOverride); - if(fragment!=null){ - fragment.fetchNewestTweets(); - } } super.onCreate(savedInstanceState); diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index 11a9d60f..f5b1dda2 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -184,10 +184,10 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa public void onSaveInstanceState(Bundle state) { super.onSaveInstanceState(state); - if(mTwitterStatusIdWhenRefreshed != null) + if (mTwitterStatusIdWhenRefreshed != null) state.putLong("TwitterStatusIdWhenRefreshed", mTwitterStatusIdWhenRefreshed); - if(mLastTwitterStatusIdSeen != null) + if (mLastTwitterStatusIdSeen != null) state.putLong("LastTwitterStatusIdSeen", mLastTwitterStatusIdSeen); state.putInt("NewStatuses", mNewStatuses); @@ -198,7 +198,6 @@ public void onSaveInstanceState(Bundle state) { * */ private void configureInitialStatuses() { - boolean autoUpdateStatuses = false; boolean configuredCachedStatuses = configureCachedStatuses(); @@ -206,7 +205,6 @@ private void configureInitialStatuses() { if (cachedFeed != null && cachedFeed.getStatusCount(getBaseLaneActivity().mStatusesFilter) > 0) { setStatusFeed(cachedFeed, true); } else if (!configuredCachedStatuses) { - autoUpdateStatuses = true; setStatusFeed(null, true); } @@ -215,9 +213,7 @@ private void configureInitialStatuses() { setInitialDownloadState(InitialDownloadState.WAITING); } else { - if (autoUpdateStatuses) { - fetchNewestTweets(); - } + fetchNewestTweets(); setInitialDownloadState(InitialDownloadState.DOWNLOADED); updateViewVisibility(true); @@ -404,14 +400,14 @@ public String getDataToCache() { Long visibleStatusId = null; TwitterStatus visibleStatus = getVisibleStatus(); - if(visibleStatus!=null){ - visibleStatusId=visibleStatus.mId; - }else if(mLastTwitterStatusIdSeen!=null && mLastTwitterStatusIdSeen > 0){ + if (visibleStatus != null) { + visibleStatusId = visibleStatus.mId; + } else if (mLastTwitterStatusIdSeen != null && mLastTwitterStatusIdSeen > 0) { visibleStatusId = mLastTwitterStatusIdSeen; } - if(visibleStatusId!= null){ - if (statuses.getStatusIndex(visibleStatusId)==null){ + if (visibleStatusId != null) { + if (statuses.getStatusIndex(visibleStatusId) == null) { int index = feed.getStatusIndex(visibleStatusId); statuses.add(feed.getStatus(index)); } @@ -668,7 +664,7 @@ public void onScrollStateChanged(AbsListView view, int scrollState) { }; /* - * + * */ private final OnLastItemVisibleListener mTweetFeedOnLastItemVisibleListener = new OnLastItemVisibleListener() { From dfc05561b5094ed5ae85d17b4d8fb3cdb2bbca91 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Fri, 23 Aug 2013 16:31:34 +0100 Subject: [PATCH 096/163] Remove toast when fetch fails --- .../src/com/tweetlanes/android/core/view/TweetFeedFragment.java | 1 - 1 file changed, 1 deletion(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index f5b1dda2..bb3365e4 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -276,7 +276,6 @@ public void finished(TwitterFetchResult fetchResult, TwitterStatuses feed, fetchNewestTweets(sinceStatusId, feed.getNewStatusesMaxId()); } } else { - showToast(fetchResult.getErrorMessage()); onRefreshFinished(null); } } From d31d7b866b56061b57c587691310ff0dbfd00aa2 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Fri, 23 Aug 2013 19:14:50 +0100 Subject: [PATCH 097/163] Revert changes around auto refresh. This was a mistake --- .../com/tweetlanes/android/core/view/TweetFeedFragment.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index bb3365e4..6a4a99b6 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -198,6 +198,7 @@ public void onSaveInstanceState(Bundle state) { * */ private void configureInitialStatuses() { + boolean autoUpdateStatuses = false; boolean configuredCachedStatuses = configureCachedStatuses(); @@ -205,6 +206,7 @@ private void configureInitialStatuses() { if (cachedFeed != null && cachedFeed.getStatusCount(getBaseLaneActivity().mStatusesFilter) > 0) { setStatusFeed(cachedFeed, true); } else if (!configuredCachedStatuses) { + autoUpdateStatuses = true; setStatusFeed(null, true); } @@ -213,7 +215,9 @@ private void configureInitialStatuses() { setInitialDownloadState(InitialDownloadState.WAITING); } else { - fetchNewestTweets(); + if (autoUpdateStatuses) { + fetchNewestTweets(); + } setInitialDownloadState(InitialDownloadState.DOWNLOADED); updateViewVisibility(true); From 9527ec79dae2585dba081f2fb790421309568907 Mon Sep 17 00:00:00 2001 From: Jason Famularo Date: Sun, 25 Aug 2013 20:47:49 -0400 Subject: [PATCH 098/163] Fix endless loop of App.net message retreival by manually setting feed as fully refreshed. --- .../android/fetch/TwitterFetchStatuses.java | 3 ++ .../android/model/TwitterStatuses.java | 51 ++----------------- 2 files changed, 7 insertions(+), 47 deletions(-) diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/fetch/TwitterFetchStatuses.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/fetch/TwitterFetchStatuses.java index 9e6a9d56..60dec628 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/fetch/TwitterFetchStatuses.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/fetch/TwitterFetchStatuses.java @@ -184,6 +184,9 @@ public void addUser(AdnUser user) { if (posts != null && posts.mPosts != null && posts.mPosts.size() > 0) { feed.add(posts, addUserCallback); } + else { + feed.setFeedFullyRefreshed(); + } return feed; } diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatuses.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatuses.java index 4909646f..2566ba9d 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatuses.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatuses.java @@ -236,6 +236,10 @@ public void add(QueryResult result) { sort(); } + public void setFeedFullyRefreshed() { + mGetNewStatusesMaxId = null; + } + /* * */ @@ -315,11 +319,6 @@ public void add(AdnPosts posts, AddUserCallback addUserCallback) { if (addUserCallback != null) { addUserCallback.addUser(post.mUser); - /* - * if (post.isRetweet()) { Status retweetedStatus = - * post.getRetweetedStatus(); if (retweetedStatus != null) { - * addUserCallback.addUser(retweetedStatus.getUser()); } } - */ } addCount += 1; @@ -513,46 +512,4 @@ public void reset() { mCounts = new int[FilterType.FILTER_MAX.ordinal()]; mGetNewStatusesMaxId = null; } - - /* - * - */ - /* - * public class Iterator { - * - * public Iterator(TwitterStatusesFilter filter) { mFilter = filter; - * mLastIndex = 0; } - * - * public void next() { int size = size(); for (; mLastIndex < size; - * mLastIndex++) { TwitterStatus status = get(mLastIndex); if (status != - * null) { if (status.getInReplyToStatusId() != null && - * mFilter.getShowReplies() == false) { mSkipReplyCount += 1; continue; } if - * (status.getIsRetweet() == true && mFilter.getShowRetweets() == false) { - * mSkipRetweetCount += 1; continue; } break; } } } - * - * public boolean finished() { - * - * if (mLastIndex == size()) { Log.d("TwitterStatus iterator", - * "finished - skipped " + mSkipRetweetCount + " retweets, skipped " + - * mSkipReplyCount + " replies."); } - * - * return mLastIndex == size() ? true : false; } - * - * private TwitterStatusesFilter mFilter; int mLastIndex; - * - * int mSkipRetweetCount = 0; int mSkipReplyCount = 0; } - */ - - /* - * - */ - /* - * private void filterTest(TwitterStatusesFilter filter) { - * - * int[] counts = mCounts.clone(); - * - * int count = getStatusCount(filter); for (int i = 0; i < count; i++) { - * TwitterStatus status = getStatus(i, filter); if (status == null) { - * getStatus(i, filter); } } } - */ } \ No newline at end of file From 8e2240731e340431bd6afd2ccaeb9c56d9fb1b97 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Mon, 26 Aug 2013 11:28:56 +0100 Subject: [PATCH 099/163] Fix for #248 change the conversation drop down on light with dark theme --- .../TweetLanesCore/res/values/styles.xml | 2 +- .../android/core/view/BaseLaneActivity.java | 2 +- .../android/core/view/TweetFeedFragment.java | 16 ++-------------- 3 files changed, 4 insertions(+), 16 deletions(-) diff --git a/android/libraries/TweetLanesCore/res/values/styles.xml b/android/libraries/TweetLanesCore/res/values/styles.xml index 8ae9708c..bb877bb7 100644 --- a/android/libraries/TweetLanesCore/res/values/styles.xml +++ b/android/libraries/TweetLanesCore/res/values/styles.xml @@ -48,7 +48,7 @@ @style/ic_action_camera_dark @style/ic_action_collapse_dark - @style/ic_action_expand_dark + @style/ic_action_expand_light @style/ic_action_message_dark @style/ic_action_overflow_dark @style/ic_action_rt_on_dark diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java index 60545bbd..ee4bf32d 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java @@ -1374,7 +1374,7 @@ public void shareSelected(TwitterStatus status) { alertDialog.setTitle(getString(R.string.alert_share_title)); alertDialog.setMessage(getString(R.string.alert_share_message)); alertDialog - .setIcon(AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Dark ? R.drawable.ic_action_share_dark + .setIcon(AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Dark || AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Light_DarkAction ? R.drawable.ic_action_share_dark : R.drawable.ic_action_share_light); // TODO: The order these buttons are set looks wrong, but appears // correctly. Have to ensure this is consistent on other devices. diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index 6a4a99b6..e8836478 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -1516,34 +1516,22 @@ void storeMenuItems(Menu menu) { */ void setIsFavorited(boolean favorited) { if (mFavoriteMenuItem != null) { - boolean isDarkTheme = AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Dark; + boolean isDarkTheme = AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Dark || AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Light_DarkAction; if (favorited) { - if (AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Light_DarkAction) { - mFavoriteMenuItem.setIcon(R.drawable.ic_action_star_on_dark); - mFavoriteMenuItem.setTitle(R.string.action_unfavorite); - } else { mFavoriteMenuItem.setIcon( isDarkTheme ? R.drawable.ic_action_star_on_dark : R.drawable.ic_action_star_on_light); mFavoriteMenuItem.setTitle(R.string.action_unfavorite); - } - } else { - if (AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Light_DarkAction) { - mFavoriteMenuItem.setIcon(R.drawable.ic_action_star_off_dark); - mFavoriteMenuItem.setTitle(R.string.action_favorite); - } else { mFavoriteMenuItem.setIcon( isDarkTheme ? R.drawable.ic_action_star_off_dark : R.drawable.ic_action_star_off_light); mFavoriteMenuItem.setTitle(R.string.action_favorite); - } - } } } void setIsRetweet(boolean retweet) { if (mRetweetMenuItem != null) { - boolean isDarkTheme = AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Dark; + boolean isDarkTheme = AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Dark || AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Light_DarkAction; if (retweet) { mRetweetMenuItem.setIcon( isDarkTheme ? R.drawable.ic_action_rt_on_dark : R.drawable.ic_action_rt_on_light); From 67c2d37474de1dd05e7e2dcf12dcfc71d4db5571 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Mon, 26 Aug 2013 11:31:14 +0100 Subject: [PATCH 100/163] Fix for #250 to prevent an out of memory killing the app when getting tweets, it's now handled and the error message is set so as to flag the fetch as errored. --- .../org/tweetalib/android/fetch/TwitterFetchStatuses.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/fetch/TwitterFetchStatuses.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/fetch/TwitterFetchStatuses.java index 60dec628..5e929599 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/fetch/TwitterFetchStatuses.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/fetch/TwitterFetchStatuses.java @@ -571,6 +571,14 @@ public void addUser(AdnUser user) { errorDescription += "\nTry again in " + e.getRateLimitStatus().getSecondsUntilReset() + " " + "seconds"; } + } catch (OutOfMemoryError e){ + e.printStackTrace(); + errorDescription = e.getMessage(); + Log.e("api-call", errorDescription, e); + } catch (Exception e){ + e.printStackTrace(); + errorDescription = e.getMessage(); + Log.e("api-call", errorDescription, e); } } } From 7dec8c3f60a81a0bef9757103db9533769c3c3c6 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Mon, 26 Aug 2013 13:01:48 +0100 Subject: [PATCH 101/163] Finish off work on #217 with glowing buttons & toasts on main timelines --- .../ic_action_star_pressed_dark.png | Bin 2422 -> 6855 bytes .../ic_action_star_pressed_light.png | Bin 0 -> 6859 bytes .../ic_ic_action_star_pressed_light.png | Bin 2688 -> 0 bytes .../ic_action_star_pressed_dark.png | Bin 1379 -> 5135 bytes .../ic_action_star_pressed_light.png | Bin 0 -> 5093 bytes .../ic_ic_action_star_pressed_light.png | Bin 1460 -> 0 bytes .../ic_action_rt_pressed_dark.png | Bin 0 -> 5440 bytes .../ic_action_rt_pressed_light.png | Bin 0 -> 5547 bytes .../ic_action_star_off_light.png | Bin 1052 -> 2340 bytes .../ic_action_star_on_light.png | Bin 3258 -> 2045 bytes .../ic_action_star_pressed_dark.png | Bin 3743 -> 8911 bytes .../ic_action_star_pressed_light.png | Bin 6261 -> 8866 bytes .../ic_ic_action_star_pressed_light.png | Bin 4211 -> 0 bytes .../ic_action_star_pressed_dark.png | Bin 7504 -> 0 bytes .../ic_ic_action_star_pressed_light.png | Bin 8324 -> 0 bytes .../TweetLanesCore/res/values/strings.xml | 1 + .../core/view/ComposeTweetFragment.java | 2 ++ .../android/core/view/TweetFeedFragment.java | 6 +++++- .../core/view/TweetSpotlightActivity.java | 18 ++++++++++++++++-- 19 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 android/libraries/TweetLanesCore/res/drawable-hdpi/ic_action_star_pressed_light.png delete mode 100644 android/libraries/TweetLanesCore/res/drawable-hdpi/ic_ic_action_star_pressed_light.png create mode 100644 android/libraries/TweetLanesCore/res/drawable-mdpi/ic_action_star_pressed_light.png delete mode 100644 android/libraries/TweetLanesCore/res/drawable-mdpi/ic_ic_action_star_pressed_light.png create mode 100644 android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_action_rt_pressed_dark.png create mode 100644 android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_action_rt_pressed_light.png delete mode 100644 android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_ic_action_star_pressed_light.png delete mode 100644 android/libraries/TweetLanesCore/res/drawable-xxhdpi/ic_action_star_pressed_dark.png delete mode 100644 android/libraries/TweetLanesCore/res/drawable-xxhdpi/ic_ic_action_star_pressed_light.png diff --git a/android/libraries/TweetLanesCore/res/drawable-hdpi/ic_action_star_pressed_dark.png b/android/libraries/TweetLanesCore/res/drawable-hdpi/ic_action_star_pressed_dark.png index ea3947065ddee74c34ac68311056166817018339..2d5f041046a285bca24ddb0bd78bd8e8c9985c92 100644 GIT binary patch literal 6855 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 diff --git a/android/libraries/TweetLanesCore/res/drawable-hdpi/ic_action_star_pressed_light.png b/android/libraries/TweetLanesCore/res/drawable-hdpi/ic_action_star_pressed_light.png new file mode 100644 index 0000000000000000000000000000000000000000..d68eaf56110a00ec4b0d73c686834fdca3a43c84 GIT binary patch literal 6859 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 FV1iTI-Q55H literal 0 HcmV?d00001 diff --git a/android/libraries/TweetLanesCore/res/drawable-hdpi/ic_ic_action_star_pressed_light.png b/android/libraries/TweetLanesCore/res/drawable-hdpi/ic_ic_action_star_pressed_light.png deleted file mode 100644 index eb236c5461bbe5c8011857aa141c620eade36bb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2688 zcmV-`3V-#9P)YqwYe^u%dRh6a4Z4_B?(}=ouY@A>c6O3(!ZD0n58D{1&%bT~{dwU-;k&_azp~;m- z^U#}j-?``e?m6cI!T)1)bxC_rP;MUE!snIuGa62Bm1{RAAsq|3W9_Z5!LyQB+w&yFQ)rsueZ>;QwwcP?k^-rA% zBTr2al)c9QhG9VH9cY#=FV2m{!RY9YS=$}3_IA0k^H>Y?M24s=9t8l`AVy|s)woCt z`dIqHpEH~_wv&493RvK=XM$QoQx_1`N0oBn7zIGF1JT>SHpf`GbTu_SG7BaqtS=iF zZan$@M&u6+07>okCnuf+99g0H&}B&NG_#Cr#{B%p`O$aQcEZ}u8RJdgG|=4vWpPj} z=lZ;>iw6NAb|oAeuLkNe)FC&`QsMpF`PY{@Fy}#8+bJ;UKXoSP3r3GXfciOGPYae& zhK!n2RFwSQo)H3Jl3K>q^kO~^uADW#Bw&4F-RaI4_5}w;tJ3dVni}A2U4YcF5kyZE z8V^j`S|m+@{Xr#@ys`H7+5Cf+^FbL~|9x%OaZNnX(E%0DpeLJnLMg692oQh8thKy^ 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 literal 1379 zcmV-p1)TbcP)P000>X1^@s6#OZ}&000FlNklmbN@ZP$p~)A5b<0VInh=s<;QvEGA3TZE?$%#jVCHTQ;)| zO_rF&!5+Sf%Z4~mbW%`cO@N`GQh`3O&|XR(^!9ye?^-jBFKCyT{rNd%Vi?|ZaX2dtN-Uc|W;=yza^l;mQ9Rm+m0o!6$3BMc|nw!11L@Khmtd&ZIrk{EkRQyFz#ldj|a23Nzu3fc5i zgVd^S5YtmArCTz%?~@1wOCS{DpB%M*rJwS3H7k|`V}W9}3&Swr)nn?^;=Ih=>(W@6 z$A^sv>T*T<&P_OO_YU1Y^vgE+Bme-|LZFzC%Csa$FQIm4F>!n3=W0~4x87nGr@lCT?m(hFU;jKw-oc~t0IsY zmp?ElX42grG~}}&sLvTdUDt1os6VV;HF2-^U$kCHTe>(~&Ln{hJ_J%|Ac10Vy6Fru zDL(>9>b1D93|pNit+sIAT}`Twv{FS9k#uz$e`^7cUVLW6`1!j<*%x97`k>g+>b}v8 ztlf|;`lugv_gt+n{q1LV)F81e zy5VRGw0&hkrHGZN7?|;l7%bMtrM6syLIH%Lu@AXR-r1SJHG$Hi#iGsCQqD_*ufYOD^(0*|n-5D~SZ03G(0t-ytc~bHq2F9ulfl~ydK@hq@-tNPLCy@0 zDo`4;re$>cpwFFiz4>1q9^C&#NPS}`nU=n&a+8d+L#Lnoc*pA8YxSLaay2)cm&4=d z51D5M+HBz)O=ao+qnC%5Nzzk4J3VGQ>e1h6Z`xkwe>9Q+Bx3=+Nj*+Mk*g>+EqsHlOU1 zKA$Pr^Bj*3X&s0aY1%p8Y@^SOx(Xh0EryFIrD(kefA~{pPvR8MzLHRG^h>4WXvVX;qfY#bLs0@ zlmx+5GcwTw&wg@fwX8oTBu>kRW{|8%$PU^*!&7lAQ002ovPDHLkV1oOem1_V1 diff --git a/android/libraries/TweetLanesCore/res/drawable-mdpi/ic_action_star_pressed_light.png b/android/libraries/TweetLanesCore/res/drawable-mdpi/ic_action_star_pressed_light.png new file mode 100644 index 0000000000000000000000000000000000000000..63ce196a24c489d0bd544215b0d9168543dc2b9a GIT binary patch literal 5093 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 Hu0mjf>Z^aW literal 0 HcmV?d00001 diff --git a/android/libraries/TweetLanesCore/res/drawable-mdpi/ic_ic_action_star_pressed_light.png b/android/libraries/TweetLanesCore/res/drawable-mdpi/ic_ic_action_star_pressed_light.png deleted file mode 100644 index 021324dfd25266756f679906247e43a3edde283d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1460 zcmV;l1xxygP)P000>X1^@s6#OZ}&000GhNkl6fEgdqOllEY^6<~nx?Ty(>MFtq&_w#eQ9eS z``SbvnzmMIys(Nlico1pML?0|va`Fu?#}MqXHI8KZ734pq4PTDJHPY){@?eV1Ho25 zjG@rk>E%g2h$vQxDCw1WJZ^3!9ByTiyQZnBmzHYiDDZll5U|r=YU=*X{djgO@mq#e zw|0fd9XsDN8SW6U?Rl^~f8kVX!_=8GXY9>DTY~iV_7b;pWE~L-AA^Q+z-E2Vu_pK9 zr}K9gMt+t57f7V7%|lc+97MK#f?J;7T`Y?{G%3$5O`N&`Pfv5T^dDbBL;ipS<^d`24pIuv3tA1yRS z0quzbV0e*kI_hjdIDLU_3jqWfgkXqG%{Cek{20ON#p!gqi!ZBuuNaO##n6_Z4P=0^ zZ6m^|Gz2V?gc#8VwzUM6Nl(Jq{E$YeI!* z8;uXw({F#eR2dAGzDt|tVL4E_XffVFC>QUk32{~&yCnZxU2ek-CJRBTvZjI3wYL~4 zz0dJvS_1foI;@Sa3v%b#-h)wr_k9FNs!SwPpIko3e_}&62XH;x8X|@_5IPmLJux8J@59 ziF3NDeaAhprm7Aw^fCX!qvo8fot+!LF%16k<0ULoziU?@6gr*V)-Z=LxQ#PU{y5dq zv9fjotlNySSd5$u)YOs$ebSqJR-2dPFXzVYEI7f?NgEOb0r#ChZ&x=o1cL$Li$c}T zqE0abdUAXy9gi2*Dqa^7Y3uda)xutnmV2MhCNnvi`&u(+13c|}gF{3_XQ-s461Vvf zu|TA=pITM5QP~%|X^JxgsjI(;TY^+{ye$x~)pvSR&rbkNxn^Tiq_K6>qP>+C$FGoT zAp}fq$prN8q%M0f$9EOWUmr20FoI)-fH8eK>XPxbd}8$w(^rc1W%AqnaO z&vK&OWcWp$4?HnQdc@X^2RM_Qk-qL!6jdn&^-bE_K3R$RmXcF{AMw+?iK=KK~Prb8at(4*WFF4ny(B7 z15JS8>Y!ny@k-+6$A_AetIPORNXsYGVklohGptw5ic9r`vf-=5RrTHFQ7`8&6DUGQ zxuv|Ax%qQpbx*Bpe5|vRkR%EA^z>MpU9B&2@2J`+X49K-vq!>K{{IcD7Qc;T_U~E% O0000B6 diff --git a/android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_action_rt_pressed_dark.png b/android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_action_rt_pressed_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..97afbda92bf2bee5a1cabd3f70a88e43325affab GIT binary patch literal 5440 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 literal 0 HcmV?d00001 diff --git a/android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_action_star_off_light.png b/android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_action_star_off_light.png index 600ae03a80c3a4fe0e0e4311a20993f2158fcc3b..7ff6c8d0e68f491e420faa9a955c9a6c19f8ea1e 100644 GIT binary patch literal 2340 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 diff --git a/android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_action_star_on_light.png b/android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_action_star_on_light.png index 06e66ab27cc66b3b775332378396cd4cbce00733..da44dd82c3ab07009b3b45b638baceb90fcff514 100644 GIT binary patch literal 2045 zcmaJ?dsGuw9!_{BKnf^OLD?n)D1u35LINfbfg~Ul!Xh9ARCGwj5HXoCGsw&GDhg;7 z+_Z~&L@HoWL>GjmZmGHkY?oI6A6TueaIlKdRam=%(0X=4#qJ-=-g9Q|y}$GOzTfLR z=a$FDY-HHD*-$7HMr4F6j@&~`AI*yVH>&siKyI!?SP~JB?j*8c9YP6JqG<>-QUj}y zI0RPa?CC~=C=_!~bwU!6B##y;Pz?t*`Ear|7>TA(f`YR#SdoDc%rr!$){24W9oGP+ zS}6uT5XeC}CPmWK5xF`fJ~t*ok(;3qDuLh)%%E%$NuWUpn3=8Ft;I#zVqk$+M4nA% zF2G!HAu`0kZ%HM|W0_J^hcE>kkgWjyA*Mf{1Mxv2U$~CR10j$L@wi|B8v;dw01*f= z-z?|#mU0o#3FBEAe|sE5to~lmBq>O~N zy!FP3IOO+y|0gk?kb@!II0Q#CbqaEDJ3UOHFp*S;zyzvGK+)ZcU5rgf2^3F9F{U(L zz=4=@SfSRMEDH#^TokFr30SK@B4uKLwvkPivN_!4Po zxBv>^OQ1!p3{_-m5G}EYRsN0@EQvLVL4%QzWr$9_7g2`mPz`gTXpws9TzE_Jy}>G% z&c$y@ESF4%YZ~o;je5~U>c@0^D_rvOR{DsR)Vq!pc7SoHnnJNaBW0lp+4q0i@_m%k zCa0QY)wa85>~DQS>r`IwuI=;c?#exT_UtL2@iSGgYbsL>r8dPjb@p?geP%CVIs7Ri zZ>?Q!S+m_xlY9mjSr>d%g#_>X{?+BazM}V9an-Yvc?B~MaN`xf^AlfQoK2P-9PnC@ z`rjYcI{QX@E{l0uF?x)U+?$=fOt>^#R`!~$I+?$5dft!qJiyG~v7LVH+I&C#QeCpG z=L5bppuT7@D#HAV_X`G9T;kt1ACx~cyT1?|rTkLyPP(`4d{JSHVehf4EcGXub47(4 zBp-%;+gsN(Flo`|@TG0|_O@c}gRx|@Imed=y~H_NCue-9hfBm*?wOLm{L`ap8lZO2 z+)JX5=gp=B!lid&pG z4MGJ}w?q|VJVB2=dgo&4@$fxAlm(@FGVO8W=6g91biYDSY;!5hjJN(@uK=*(g>b9i zk*JX2b=1Ds$%fPf8){~HbTzm=^K`4#>lEebr+~}5mP1x+8yz5>+0(Dz*U!%uVHH!i z)=~G3F$|UlR&%wvtM+P?pJJkMFrdB1(cqpW*}S39ck4&V?$+N4!}5pV)6v5ohF??a zD8W0Dz%}>6q+3dTGq0ZTo;o;n2&3oZrrb2*k6xMgRyT|6N32s>eIZ9buC57Pxu!3% z(cf`Svcfa^`pRBlQ=8gB(Tuzp4=r}|j>qQ53@a+@I4!*x=XI#=7S=x&R)!wmrE_ZwY4FPVtMg5@ zPA`+L$*Fp|c6e&tb9w`+wn~F8Q?< zj0fr`j`=sesJ641Dr>I-w>x)D*&eO}XZG`;e5c{-y_3|gdE#i-`?t?^$SDIi9s_mA zzUhBEPQF~LA5at@fY?Uw-iOZKmU#@}_=DIn)ec^Ekl~o@jBg&J{0asOE0zF-gUJ9S4Q85#^PUUX53ao>^X=X$IS5?)qiKvwO{3&n{~dV z{3}L-N@gpa$q1m2Y#Om&Rp4;SY5G~>p%v^HX;yvo&n?vyWA8WM-6!t%JHgr;p8L$d zfWN*F4W4WI$y&sIF}Us4L(T1xnz{{Dg{DO*=q;dHQI>1%$2y*Dt2aH!kzp~ii;^A1 F{{d4*A{+n! literal 3258 zcmbtW1(mXEhu1F&x(k_BXmx6!@C=JpfUD74+ zNC-;o%kww9_nevea?d^I&U~4;`zE?np5Mr#nuT`p5(b2!0MWy42L-<#l80wcz*MJ4KPqm_x# zUe|B=4+z~JQRM$~mf%`Tqfrm?cjl~)egE@DyC9`$c6MWZea4^*V&l+n6@HEEuy3=v zdi*Cs`jtQPFea9xa2*a8g zonMkxPU5k25l)>S@eQHZCMVy_fW$NO%*G(b0YX{C`bzrY+F48;HcTB z{ksq;0opBcWdwygRKL>A=Lcw4{g-|KJksJ5hxON~_mTpjm5&j5ugP}O&LY}I%-&A4 z&`xoQkbe&0>*|2eLdc!b?EVPh%4ZOv=%M!n#iZQl2pHr3lfb_G==oVe6SD0Ee)$f$`(56y_+s}30Qj9tWO64Ro<>!w2f4r@l zC||HOTH!`Bm#hZum2BH)A(82NEGgd83HfkOlq}6@-~&%3Wkt{J_YW!wn&VELMn0ej z=`h-DWb%Y42$ut=rXJh~ZZe}+%EitnduxtNfsEj}S%)A`TB+ejfzP-8bg?)}OU1zT zM0uy^lIbOALt~*`3Vd{NP-(%Y6ny;;?_lF}<2vKs=Da(iWx29?w|UdP%{hD4k|@3s z<+|G!wT@lyT$fpATjxHqA;&su_`N%~SQRqw_b_1Hpxuz&Aa==;*0e0lF<&e#fZdWy zeh8^5XfUraiz%g-{U=9pD3VFvu&C;7`owKFX16ov> z7f5Flk${zz7nd)UQ&=8b4#1Mj9$AD}>sZQItd)^{ $KKzwV6#A$DVN5SBTIc? z>hB_~ui}WUJB>O`q3_J{KiIFe^l(u)vDO8Na(hx$ME`@4>k{}dG#mCrq&e$~qd7sf zysSVGDq|pHRcC(u%2l0YEz9rxb)X5^mQYFNaYXzQ!=do1Fk7*#QInL5t!H^gW(K@M zufnWCcdu2xdcOo)+^XGdeSx9Y>@^Uy71Tv04-;XxEM_ehOUO%@j8&CRtHsMbi`WX9 zwNPKZOAfN~zC1$b8Tphf1-EYfWe=CQf?aw2EjiVtgcH|M@)6Hd4zs9q%lY}Ja7gsd z|1yKxb!tG19MT;!SDvRfjj0q)>b%gQNp$bAUE^Ex>hbC+6d)Gh7BDp4H9p8OH*P8x zE><>DHtHQ39C|x6l`WU6Dm5*=mAjQYox9wKco_6hw4t=&lZ$@s`om)DgN7FGsE3Ny zMR3c9c6B;c*ed?1=BnnBTO~~`X03sK zK)A~tYmqyli)2PN1w*$4e$wlSto@g`l;bGb6Y6l#h=)^G7jI7y^hRZYKdEJBr^ zIUF*p{Z{jTv!=GDqOc^rWNkmF(AL=3IAGf8lV=~b41LOrbH;_>#y|<09}h_ohtb5? z;9s1FgmHgOQdgRH`CU7^ubG(Nq{*n6{H*HPMtc>vTi?%=D(AM1R?+H7zOnGzV^W!NsIdiTz_Qj~tqiTDT%?q#VvU%AoQPVvxQEJ| z!e`mf>OJDF)`OF9EL{JwA-kfuNVUB8<1fpX`^Pb>*j0+PQ06R&K0Dvwg5i#ns1l|! zaXL|@3=N}LlY6iJ)ua_EWlH2fqDS#3kq38hbRc;o#^lFhXP~wsoF+$lBE}&vf2Ov` z1@m>w6p3y$Jr^uXX)&TQTFh0-W6F8L{ zz3%o-Xq4bgC;8@Cmr_Y&Ek@n|Dc*)X6q*(xsYSY2xqcmr>sQRE$h$kVKUmj4pQ7;k z@C|OCu7hsnWkXT4p_Ld1e6zLEL$OxHFL<7OjgjbX^aJ8bl~3^vB3_fG75i41)e)@% zA;zAVNA3O3+UxN=_b4pMH=@G#7N+;@OyLsN%k>U_qp@sijB)YR4D-yHj8A8T7J@d| zVto3)W-q+@SXR;12jfeQFo?Z9ap|{o^j!2S7qYmx8F-JPH;uSOWiQt^nH?JToq=XJaug97t>E>YGqU9~PAa9jCyAkzD#sV7C9F- zjy9i72i3-=c9%jfb?5KUyp~n54mLQ3eRH4Nc{Y)TJQ_*Frenh+#Q!WH=HE7iZaEDv zd(ikCex?mv8P~=oY$>-W58EDn3OuTv-=MepWR+8+Wbd^bxT|uVHeuS^{JJ@(y2;kF z=^&)FKGgMWhb>QGc=4n)_!kpyYBEnzb+Pq0#OJL0>~xuFF~VQ)YIvY|7A1I4)neLW zf1=%1ry}6;^b$+qTDAGvCwE!};Y~ zkc`x$lLr_3?WhG5$6?_zjp=$A*Ha;!+n*1o7NaE>X{>2!I6{J~<4Y$QvH6?6$>pSH zZVW&OKLF@R0RG@^bO(TcBmvk(0HBlw0JG0a`)-|^UA_B8Fl`wb85|CG!~f^-(-6>xbz$Xl8Q=DBjX452zQTwu<+>QlL>l3?OYkX3JLu!$dAw76wsy-L=Jdr zk?7wPZYCi53pA79n#^_pvqMJNjV`o;6=~oI5ZvH|t(elyHD4Hiuq98x4*#5JrpB2% z3m+i_*rUuih$s<+Tr7A9yq20

    xTcW1%#NMzr?pZ9St{`Tn*SfucPg^+cgYEc=_3 zk5P#55)`%B0MYkm%Td(IU*&lc>6HvOK0)~5ODudNUJ6p2F0;Y@_z9Cy=3RU5EV_*_ zw^>=WPp9L4-YoeU_zU+6X-9vul49bCG>C(k{*?yS`RRCZ2}Xn(Z|PqUe$r`u%7zk@ zBKo+p?OC+V>4 diff --git a/android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_action_star_pressed_dark.png b/android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_action_star_pressed_dark.png index 3bcb50c35f6f52b69c95d75b8944cd1361e5d665..880e80f4a3a3e321a74c0aefd258078e78e0d539 100644 GIT binary patch literal 8911 zcmWkzWl){X4t@{rP~4@(-HN;0f#UA&UYs7BLUD)UAFhSsc5sJc#jUuz+vV=evq^Tc znaKXgWWRq=mPJP)Mgaf-U0zN~?VXDKA4muQ09thtmwOkGUF3A#0RR=}{{R7*KM4T< zMa5Q9^2-++XAft08)p|vc}Yo17dK}sTL()3@LtMRx7JWUz!$z-yOvOlgd{6EtKlJ0 zs!2pca1&@5sgSW0BB}Bh@l?A%NK3PT^;HfgBMWHMpZc`P+h7?9djXZ7o z725x8zuO&uZI~C?tGvptpG1Trp{2@kseXo_l}V6)*a#Wy8`#`t6$?V4b^)-E>Mf|; zUp|3=`#>QfrjJm>P5|URgNg(|!C6pt(ug)TU^4XSlQ$5W0pQA9Y71R3 zRb%ZjzGo_NUph!1iNzIBTbq@fenOsr375wd#xzrmwZ|ueh%<;AbK`0Z0P+&> z-lM&G@t(k_o|xc?ZNxBUIqX7s`)Fpi^|~`z;qqR%O^?8-S7x?)Vu&CD#PPL&<`mAx z2sO|1F50RNQ>+2VJ6O`ba`}I5r1Rrj78iH6w-*%pB=k*3v;$tPdyJvlFAfiZLeFZf**qEmVkMvG3IIk@)T|mK^`e7F03ekY#8@j%a@|eH3`HRAhF|GMeKz3< zm7wnHk-(Bbv4D`enJ`oaOVEdp*OD=su+55*aYI#Y!joJuSbH>^F@#+(A5D>Ry6M}4 zkm1CKkZ???mLfrBQ97Sukq9!v?y0)v;IN~qDTgC*RX-{we3s)-i_)Oflq0(oc7x%M zFpz0Y5F7$HgP+6OWjT_A>Qsei(HbOMN_mMxWeQOLSa@(`#^L8>{c-zEEc}BffA3F) z4dzmuh~ywUbe|BBtIvU*b)Z+`7aucnlKJSbkCkW@1H`pjm9TB!Z_FoudBI@^Nkfr& z;JhR#P07XObd+?I7vxGQNvXL%EFtqE!-lH%(0xoQRs2oc`r)CE(2SEKLPw7I(_id3 z95yV!NXb54YV7ZloOCVmF!I0t)0oDdmYH@^`*grumc=bc{3&U8$-=%4kw2N4l4&Sx zJA1o#n`@h7o9a>@CEHBQ^}l=dfAnf2b_zs0SUcQ12$t!b;+ln-YOAIB8XrE#=}A=O zH>%aBMwH@kduH;Fhv3UA7F89b%n;iU*xcFH?0d9+SWO{UPWz)hJ$fL!pSBNs?S+OO zju$c*X-!X*MTkgfP2@#blde=uG!soUsKL(5ag@H7ftlf~sl(XF=#Q5$f|8<;LYqRu z$fi+NUR=Ibj;eX3IjRv?W~3faEu+b$zEy@in_8h+p8e%WokZQbOt3Vf+`80RL-fBu z-IwnOy1h!hDw6-H=KV6>Y9F9PH7Ba~W~Q=7uL$=H`rJqRYkblFD`Q*w3t3yVaCuoi zza*Cemv+6{RkD>R;#Rur{Z9{N=4- z6|zSiJk=*9*~J~wZMsiE7~+EpbOv;?)^QW?*?a1X>Z>IvCHP=rftza9a{D5Z{5C1C zE~k>y^qfv3NRE8Q2%FFXCX4S!Q~58 zNyA<-$s*Gf)3nXdgqA6x!a1238O$HH0|r~vTaE*c1BJ8*v{bZ;;6w0frW&}Vn4wru zNl5&Dx|8~O_&=Oe7ocMVv8qj~8dcbC_Gl@01z_rzgGs@6s zo2{NTBWq1y-Qpf{6&d|qF?f_UO@uXzWMFluV_U)F#?^4sclstft3Ipeq;$FFl;_m; zG-4%pj60VhN0-a}Pw$ZAhU(6gC~9sByZw4)po*kQkafe}CpL4o1nsK%+NL6}@;lQr z0+Cx0x7;m}Eg{}D&NW@*FE73$sw-AhVA=AvZt+C?M_!9Ko_JhvRq#%C6_w4`p(ms1ltw_4BOFc@ZO08vCbExpwuqb?H6e(x56I$YJ zCFZo;?i?I~{2hAmp7fmdRPY+p-^+&cTo~g(MNdrc5VB>w=AD*My0Z9oC3L0LEP)*S%&(M=oWcSf93hDb@vai(RN$mW>qF~ZtFNP#mSJ_T z{Z7$MY~(43!}j&@mGHVOD2)=u`x<)m^Nfgf)|T2PMF2d4Hbe zzMWwAU~eWi7KJNnvykcRc2wH&*9p1$ETe4U!83(xAyf)AM>R4!&Z$(KXs1;NcF_8Q z?SqWEM}oT>K=wzdnkYMA0Y@wICx$9IY`W_WrjOy-BqDgyg}=xec_50-JR(hE&ZJd6&Eu>Mh zrLaq=x!tm4cw$^oRO3I5YmG+@p3~{o2GjX_r>RpCzxG@1XW{;B>>wEBDb!F}qJqhXb@qwC2a>@@5P;wOy8`Igx^vT0!rwYa}bN3s}$6rHcx zXI?DmJm{J+KL`GOa*^`cKDa|(zavK%So-?IuW}P{hTKeAJ@0|HqeR!o))8vXXnC)VvS zozGgaJT|AL-=g;f+XW{KE}K0r>y~$Lw41dvYXpoP4?PZrUXx~22HSqNWmdNs*teYe zb~N}|-5rqR@J_5=clcc3zx|!d;TK-*xbk(r>%Y5M$6pO}qkEYcZCmuBJFRM0X*a$W zI}u-$T#c9$)qh=CI9vH<2ldLknp%;)LkJ6*d`-BC!<2-N%ZM8dM-M;B;S=HK|0nA9 za`0RtIcYITn?vwg@H$#efX^0qKX)`gF_k`*pLUs+)aB@3^l}J2BC1&)=oujI9QNko zFuK-yI_dUW@gh4bT*p+|_NV+t|7P>>>qh-g$x{+hQqmh7Z2Hx+ITy?Fd%p>1Ee;k3 zfM2oxPpV1pGNrkk8W;e4X#fBc0ss$h@ALowJlO%@&;$Sk(gA?LInlUZ=A9nOONncE zFZsu^p!S&HhUIo-!f`D8M#ueyrUeIP!Z+-~%-+kd~Vc;PG2 z=4!6Tmit_epTP(gyzG4s%Yzp#uG^H+zu4K?bvW4Be^;-3O}@K`ZX#IF(M?Zt5b#J0 z3fd%rg_RUSg@x^f2Z=b{4zjJ~Fv(vkh9F!8mV#7t2?+^11MaWqXj#T?+$Ylb*5(M4iSY*>hlps`Fao6F*d|bxgVMzFR#vfVF#6zDO+cramx4A7FJK^C=lBHj;V5pvQGh*4zJe_jCU0nqx{7eY$_4cqScloll)85w^pBKsW+N%GY3k55?|i_LY_-2MRR7GA(* zQtly?n{2@Jx&AqWDMG)Cd0I1~%B>;fTeSQqgQAb4sy6w5#I7^@L~qg8k4a#L004n*+n! z@w&19PmR0SpmW-z6@^}v?;hPlgpf41gQ^{41;NQ@r8<|q$sW|q96q&QD)5ga#}{!0 zRt@F5yO@5QD4|o^Mk&xLl}=BeawE{xZ;>o(+(7}FfK~nc9fcX9JzEuAiR;q1sqyfV zHbX%GDiO%$8P##%AhJ~Tf&nGS6q)C@MDopBU5Qt9^q3*ocrMkPq}&J|omg5O<--!p z99$b;bq63wvv^)sm?~D%B#qz94L%x&?gmAe=c~x%X1r416~6(dlvd|plR?4%>*%XbkswUIfoQhCTNjdTf5QZWJ$tCxcB5DGl&<$X0+ri zc+=fh6M*6mD8tYK_mbVOEQ0sWO#|;1$WE%c~D`3>ZLD-)P>=R)D}z zYueS)j+w)Sr)9qBteqUC#Sfk)@_NzkF(OD3vh_b5OB{tijUnx zoR(Y|92Q)rppm1m6Mv3^ap#Ah#-^eO%)`(6k5_2y@GFR^m!Mg|xv|6SZA8zwO;r_F zlb4tqtlpr(m=w!8h%@@#f|FR0njp>WVrsYr@j}W?DHJN42fP3Ev|hKIi8q}$9qik( z_+Qqj$Ew5hjR9+#qIKP(hCsF|p7g`%aZxVB8DjE^FBJrZp680fDrb2rYCh!`ukJni z2ZcqbTzY*~5Evo*E&?OvXJAOwH0X!0-^TH(-BDU6gN)L>6bM$Iqv%M3y*w;f7{bND zpM=Q{b`TL+3^bwreZGfr*vhj6+!p)z#Qq^xRRXr+BHuUyY&bE{nHKhf%A90)cZ%pb zA#2VtHn8HfqZ8CW&MarNeyWbaj03Ox9JyRwbzwX>qf$t?)zQG`0a-yKjrdQoQk*GE z2I`t3e4HGj?_hGfV06*;@bMH%Si0+d$XAAf{+N`N+11YO&WUHAZy(rEGUAJo)v8}s z0`6|8A1ij$hx8c4mT6p2712YZvgGejEn1fjHWIy9d{pRX2}LF z&TJE-=NT~qe+z1`*i&(z>J+4$0LCg*kH>{e)U@9D(vDCExZ*bf>B zM{NcZPd&G^>`(za%n8o^@}GBseHV4x-{i>H?Bn=^%cV+H2D@O>SM;KJx)Vp9b!^M$ zUhEH5YbYCSWDR(-z%k-E4WM4fef=#mlIq_gD&SLm{d=jrhxuRcNdN3xH=P*vG7Qv# zVN4k{{G-38Z6Hs;ycAY_G0q&b_I0tmSmuKQN`BFA^)wv`RyXep97$ zrF=xa?Czan+p()0?QQwxk>nMhTKIXiZh6ZIG1-gU5D(GV+!egF>5=>&z~C{4@B zgz#8{TIs=%d;$mRkE{iJ^HY0z!59D(!`|ogyib4F#|J6TfO8H&QvqT7)H<$3<>avC*`>WM}AO+IJ zt4TU0T(1E)E%RTbmu=qrB4qae^hjbGdGxmm=-rr^tamuyLsp{ixyomsM3np>f)#b% zF=-T&$h06H;sZ)He0loNwwRckk(JUZB3-Cant~!7rB}4g$Ipc18WcAGr;59^RZVnt zb4vI2M;TI7j|8L(yKWZ0*x1+K+-%RH=|(9wFzEU40+`t+EiR#Vo}$DK2An=vRHFVO z$HxJWBk)k!I}m5Ng?ryK-}}W?8@W01*XzP^=`D}M&sR7QdthK_;u_=)w}A_x0DdND z$?~O5|6OwEn0ncU?^sb@3RdAJ+?EoH0Xh+($IF&1^7Az_Igf=$pqLwy#rug{9+EDl z%)g-0f;J5U%|v^LB{ePY+sQV}J^vsi-A@GjbqLGL4yZn2lrXL68?r$4sNrpQw`$r` zRtSqHN^A=3Jqq+IU^|LSMkD>l6zCtnN%2{>Qy3qdG&;&pGln^5I+;l1QU5t{EppKK z+J=chd%8fz7T3r#Pwb(Gw-a=XS8hQDj1u@AGPls06C>lqpZR=m6sc3A#bpp8Pio`i zU_ZY0@L0?}aW1R*&t)|p>iZoGpSO~1`sdJ7Z~Pz{RrXFX82?8nYP_84Mey-S2$5|o zZpkuN8pND=4k7kyY{@zU?P`vX7Hb+EsUroXDG^^OJQB{fX!jVcH{|t$b&sm1>dR#Q zuz*dN5nw{d{vOoT6k)E38BL4@18@nVWHRgu9Ghbb`>T~HrdO_2bv_>94e%_n2m?y3 z*4C(QoSv|~${;a(Lm`eu2U_p>lnyg_oFeQo9H3v{F#GN-s)RwaTgBvNW~QN> zgk+83Olr^ZSdeK+#I{J=>_ZLhxDs#;&z~W1=I=t~P_A(K1FWxrDnq+6^Z!H+v+r}~ zo|ILcKZNAFXA8evcpH$CdX6jPFqKs#7g;PS;KU~#g>lvo?|buK@MuXYfh@vHr~%>tTWek=zq(BO^k{wlc17XrFaZpzs1e9S~WS zMK>q%kxf<2^i3MHt`fwabF@lXm!h-+q3`eQBV_1T5}9Q32pMqOBD@xkv*)~UR1pnM zeuEvgYnOKNGSeIX)HEt}ei6LU+a+PZG^}0w1u2^P0I}>x^jSH&4<|)2yj=s0J z7DnNdH9(a+9p#mX1W4|?MY5i5I-k3o8N;sO^{emt2(bU|gv>)GSJ&Wy`0=!_Q)*S4 zDF6iK@!6U9DSKBXo4045S0J9hBle=lQnq5;{phfNsH%eCQ><1NV#k5#7S{{#=eG6d z%ag+_KdMS$c|^R%6B+=qBs#o3)(PFyN!`=A{Xb_(#F;jEzDN$#=7#Ov*T4W}N=yPL zNqsRz^hpP|gXX3sh5enit=UF8tIC38EG$i;Fgt!n;kg2k!)P&E{>y!^mx51+TIS>*GAzYNxV zBPY#qMV^WnEOf1DJzyQ8jr#d_(>cBh9AqF`oXT6n9QBo!K(<-EH~V>a>R&{D1|2K_ z)Qp;DXOkW$SxCRQI=RAb?Q825>7@n!)L&`7iYVJ$9PaMC%&$#kB1PI?z%&)Z8pM*5 z`qp8(VKi*Wd4F2a%|a_wWwv1x2jro}M&Yz9iQxWs=Q#9jTF(LhbRfkh-O^_FwRh)6 zqD%ri9CgSkvDCBuOZn`#z}C!WR~iAAEd}o9-jI@th=xzKKV`nCETYKC^iMS{NK<|< zEFwdM1_c|}ov(m#fCWeV*gc&kJC1sMuE9+H)ZKAr`(2%IOWVvM+e~w!%zWD@OQP_6 zhIc-^K#3NNXgI?Sp7D5DAI%z$v1klEdxFozQ==Zv?%lBd`YD5@VS#1%AmMdG+p8M< z<-M7sWw*_&R;(+aFE1YX|6VR%S1?juK2lfCL#_LPq;4hNqG2uGB7ZGjTE0=s-m?b7 zrGZu9j$J}s)q4>MSe#+D3o@PuRsWD}?V-v=^!Q^bt?C{Y;#Q~mWcO%HeK_nIOp!4xAs-c)3M^Zhx ze{6~ytlFMYL=;{;PO5lCI(TjsZb}q>*}QaYlvWsHNl2_@5=B?<_olb7AYHg*W`bz+ z3lzG_WKK$oL!x%xU8r;U4mWC27b9Zy2;bI~YNbw(^O>Z*Wx3|g>bWn?*lSlqAGg1- zjNYTEI>T=T83H;|k24Y79XPfgA{Y8 zI(OdzM{?DVvpHp$Jc}<0Fu?oxqwv?gG6()TgRcR`QAwKYncQQD~`@eNT5yC?& z-Ed_qBiy$K3mRMcyKG5HEmu^HxT@zPQU*b%AaPv(aO&e~FlLyhE z?Qc9}CFjZl+LOXtdAbK==YOysy^DI%xV#A`6k?PEIRiZID&|=&dFyimT&`5tbJ_Mu zJLQxs+4@lg3MoXAjhn#PBLgWjDoh{|U}bPpm8#EGxXIHtr&o>AvmTgfEN_W2Fdb>E zdhYp~%M$lFrfn-K zE@!OkbE{Z=JrygoznMQS1GcB-22clu&g}o`v8Zmcv>XM9U-(zK0W8vKxJK&BI*JRYbGB_|+ zphfeAQjle|?Txh#; zuj)J|8)~pLpZV(FWk9SBGXM_AO0j-|HPY^&8je0HOX|$ySgsNh#&6(m&VSCLn7GG;DbY7flW<*35w(i;lNojG?6;kw0(jMljZcZv) zqoIZU#h4s_w(Kb=4o{+Ff(sD${*_dI)u8tBm3 zZkY;!>Pq34d_d3wd*Y9sknxdv@!Sf-R6I{dCUrt&#Gg|^d0mBbR_YpH@EM-sw~i-o z{w`yYPR>3T(5dO<Wj(4-TnlJwzw<8zgiyBUpUL&4VwBUZ_lj87&Go|!= zN`{#A#|uVM%W-!Zf8Dy1G}##+>+g=Y7FeR#9%nA0FJD@-tG_`MitTUMMkNgyixy-9 za%7_ zo?uLZzh2)*Ft6{I=pvq43lkt`K0<~X8lTbGMlWr>!L0WUE#2z01WMk4Ny9e_RnL(b z=4`l_7(U***U235Shhb9>_cPti77E7_Jl>`(h!f(-Fqnj3>Scf-sSjCMwmM zc-MH~2cB2*h{>?k#^P`h&7S;sWSHfIR4A?CKJ#nzzM6|5;cdNS@Qn+=sXOq!h(#lfR5+=d_17Xqh?f?J) literal 3743 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 diff --git a/android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_action_star_pressed_light.png b/android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_action_star_pressed_light.png index a43fad115ceb5633afb4c369a521956029e74b43..9bdce39b1178bc1d19ec78a88e728871e73f98f3 100644 GIT binary patch literal 8866 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 diff --git a/android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_ic_action_star_pressed_light.png b/android/libraries/TweetLanesCore/res/drawable-xhdpi/ic_ic_action_star_pressed_light.png deleted file mode 100644 index 2b9932839990f5aa9a599eba09e5ca4e687eda23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4211 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 O0000Favorited successfully Unfavorited successfully Favorited failed + Favorite being marked Unfavorited failed Unable to change Favorite marker Retweeted successfully diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ComposeTweetFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ComposeTweetFragment.java index 6ffcfb14..8d765bd1 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ComposeTweetFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ComposeTweetFragment.java @@ -539,6 +539,7 @@ public void retweetSelected(TwitterStatus status, final FinishedCallback callbac new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { + callback.finished(new TwitterFetchResult(true, "CancelPressed"), null); } }); @@ -547,6 +548,7 @@ public void onClick(DialogInterface dialog, int which) { public void onClick(DialogInterface dialog, int which) { if (mRetweetStatus != null) { + callback.finished(new TwitterFetchResult(true, "QutotePressed"), null); beginQuote(mRetweetStatus); mRetweetStatus = null; } diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index e8836478..5d5fd22d 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -1284,7 +1284,10 @@ public void finished(TwitterFetchResult result, TwitterStatus status) { showToast(getString(R.string.retweeted_marking_un_successful)); } } else { - showToast(getString(R.string.retweeted_marking_un_successful)); + if(!result.getErrorMessage().equals("CancelPressed") && !result.getErrorMessage().equals("QutotePressed")) + { + showToast(getString(R.string.retweeted_un_successful)); + } } } else { showToast(getString(R.string.retweeted_un_successful)); @@ -1338,6 +1341,7 @@ public void finished(boolean successful, TwitterStatuses statuses, Integer value }; boolean newState = getSelectedFavoriteState() != ItemSelectedState.ALL; + showToast(getString(R.string.favorite_in_progress)); TwitterManager.get().setFavorite(getSelectedStatuses(), newState, callback); mode.finish(); } else if (itemId == R.id.action_manage_friendship) { diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetSpotlightActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetSpotlightActivity.java index 0848f389..b02e005b 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetSpotlightActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetSpotlightActivity.java @@ -253,11 +253,23 @@ public boolean onOptionsItemSelected(MenuItem item) { * case R.id.action_reply: beginCompose(); return true; */ } else if (i == R.id.action_retweet) { + + boolean isDarkTheme = AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Dark || AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Light_DarkAction; + mRetweetMenuItem + .setIcon(isDarkTheme ? R.drawable.ic_action_rt_pressed_dark + : R.drawable.ic_action_rt_pressed_light); + TwitterFetchStatus.FinishedCallback callback = TwitterManager.get() .getFetchStatusInstance().new FinishedCallback() { @Override public void finished(TwitterFetchResult result, TwitterStatus status) { + + boolean isDarkTheme = AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Dark || AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Light_DarkAction; + mRetweetMenuItem.setIcon( + isDarkTheme ? R.drawable.ic_action_rt_off_dark : R.drawable.ic_action_rt_off_light); + mRetweetMenuItem.setTitle(R.string.action_retweet); + if (result != null && result.isSuccessful()) { if (status != null && status.mOriginalRetweetId > 0) { mStatus.mIsRetweetedByMe = true; @@ -265,12 +277,14 @@ public void finished(TwitterFetchResult result, TwitterStatus status) { showToast(getString(R.string.retweeted_successfully)); setIsRetweeted(); } else { - showToast(getString(R.string.retweeted_marking_un_successful)); + if(!result.getErrorMessage().equals("CancelPressed") && !result.getErrorMessage().equals("QutotePressed")) + { + showToast(getString(R.string.retweeted_un_successful)); + } } } else { showToast(getString(R.string.retweeted_un_successful)); } - } }; From 68cd7f0230e11ec1fdf30e9c4fd62e2c017b9776 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Mon, 26 Aug 2013 13:53:25 +0100 Subject: [PATCH 102/163] Fix for #246 added absolute time, also added mixed mode which uses relative for last 59 minutes, and then absolute if over 59 minutes --- .../TweetLanesCore/res/values/arrays.xml | 31 ++++------------- .../TweetLanesCore/res/values/strings.xml | 3 ++ .../TweetLanesCore/res/xml/changelog.xml | 1 + .../TweetLanesCore/res/xml/preferences.xml | 9 +++++ .../tweetlanes/android/core/AppSettings.java | 34 ++++++++++++++++++- .../tweetlanes/android/core/util/Util.java | 6 ++++ .../core/view/DirectMessageItemView.java | 28 +++++++++++++-- .../android/core/view/SettingsActivity.java | 9 +++++ .../android/core/view/TweetFeedItemView.java | 30 ++++++++++++++-- 9 files changed, 121 insertions(+), 30 deletions(-) diff --git a/android/libraries/TweetLanesCore/res/values/arrays.xml b/android/libraries/TweetLanesCore/res/values/arrays.xml index 0ee03bc0..4f39f0c1 100644 --- a/android/libraries/TweetLanesCore/res/values/arrays.xml +++ b/android/libraries/TweetLanesCore/res/values/arrays.xml @@ -2,6 +2,12 @@ + + Relative + Absolute + Mixed + + Extra Small Small @@ -12,36 +18,18 @@ Supersize - - small - medium - large - - Small Medium Large - - small - medium - large - - Holo Light Holo Light w/ Dark Bar Holo Dark - - light - light.darkactionbar - dark - - Standard Quote RT with Comment @@ -61,13 +49,6 @@ Name, \@username - - username - name - username_name - name_username - - Never 2 Minutes\n(Rate limit errors may occur) diff --git a/android/libraries/TweetLanesCore/res/values/strings.xml b/android/libraries/TweetLanesCore/res/values/strings.xml index 20d9d17c..a6e02e2a 100644 --- a/android/libraries/TweetLanesCore/res/values/strings.xml +++ b/android/libraries/TweetLanesCore/res/values/strings.xml @@ -437,6 +437,9 @@ Customize Lanes Show/hide specific lanes + Time Format/Display + Time Format/Display + Font Size Font Size diff --git a/android/libraries/TweetLanesCore/res/xml/changelog.xml b/android/libraries/TweetLanesCore/res/xml/changelog.xml index 563260ab..05d324a8 100644 --- a/android/libraries/TweetLanesCore/res/xml/changelog.xml +++ b/android/libraries/TweetLanesCore/res/xml/changelog.xml @@ -9,6 +9,7 @@ Feature - Added URL handling so that Tweetlanes is a choice when loading Twitter or App.net items Feature - Added smarter fetching starting with small pages, and incrementing as extra pages required Feature - Added refresh after posting & refresh when loading app from notification + Feature - Added ability to show absolute times on timeline, also a mixed mode (59 mins a less is relative) Fix - Links are now shown in full, rather than a "display link" Fix - Links in profile descriptions converted from t.co links Fix - Reply when loading profile correction. Show "Tweet @username" diff --git a/android/libraries/TweetLanesCore/res/xml/preferences.xml b/android/libraries/TweetLanesCore/res/xml/preferences.xml index b15048a7..7e907420 100644 --- a/android/libraries/TweetLanesCore/res/xml/preferences.xml +++ b/android/libraries/TweetLanesCore/res/xml/preferences.xml @@ -26,6 +26,15 @@ android:title="@string/title_showtabletmargin_preference" /> + + 0) { if (oldTheme != mCurrentTheme || oldStatusSize != mStatusSize - || oldProfileImageSize != mProfileImageSize) { + || oldProfileImageSize != mProfileImageSize || oldDisplayTimeFormat != mDisplayTimeFormat) { mIsDirty = true; } else if (preferenceKey != null) { if (preferenceKey @@ -301,6 +317,18 @@ private void setCurrentTheme(Theme theme) { mCurrentTheme = theme; } + void setDisplayTimeFormat(String displayTimeFormat) { + if(displayTimeFormat!= null){ + if(displayTimeFormat.equals(DISAPLY_TIME_RELATIVE)){ + mDisplayTimeFormat = DisplayTimeFormat.Relative; + } else if(displayTimeFormat.equals(DISAPLY_TIME_ABSOLUTE)){ + mDisplayTimeFormat = DisplayTimeFormat.Absolute; + } else if(displayTimeFormat.equals(DISAPLY_TIME_MIXED)){ + mDisplayTimeFormat = DisplayTimeFormat.Mixed; + } + } + } + /* * */ @@ -334,6 +362,10 @@ public StatusSize getCurrentStatusSize() { return mStatusSize; } + public DisplayTimeFormat getCurrentDisplayTimeFormat() { + return mDisplayTimeFormat; + } + /* * */ diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/util/Util.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/util/Util.java index a174c31f..671a0dad 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/util/Util.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/util/Util.java @@ -46,6 +46,12 @@ public static String getFullDate(Date date) { return formatted.format(date); } + public static String getShortDate(Date date) { + SimpleDateFormat formatted = new SimpleDateFormat( + "hh:mm aa"); + return formatted.format(date); + } + /* * Given 1234567890, return "1,234,567,890" */ diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/DirectMessageItemView.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/DirectMessageItemView.java index 9068f8b7..1a7cd84f 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/DirectMessageItemView.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/DirectMessageItemView.java @@ -40,6 +40,10 @@ import org.tweetalib.android.model.TwitterUser; import org.tweetalib.android.widget.URLSpanNoUnderline; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + public class DirectMessageItemView extends LinearLayout { private Context mContext; @@ -172,8 +176,28 @@ public void configure(String userScreenName, TextView prettyDateTextView = (TextView) findViewById(R.id.pretty_date); if (prettyDateTextView != null) { - prettyDateTextView.setText(Util.getPrettyDate(directMessage - .getCreatedAt())); + String dateDisplay; + + AppSettings.DisplayTimeFormat displayTimeFormat = AppSettings.get().getCurrentDisplayTimeFormat(); + if(displayTimeFormat== AppSettings.DisplayTimeFormat.Relative){ + dateDisplay = Util.getPrettyDate(directMessage.getCreatedAt()); + }else if(displayTimeFormat== AppSettings.DisplayTimeFormat.Absolute){ + DateFormat df = new SimpleDateFormat("d MMM, HH:mm"); + dateDisplay = df.format(directMessage.getCreatedAt()); + } else{ + int diffInMinutes = (int)((new Date().getTime() - directMessage.getCreatedAt().getTime()) / (1000 * 60)); + if(diffInMinutes > 59) + { + DateFormat df = new SimpleDateFormat("d MMM, HH:mm"); + dateDisplay = df.format(directMessage.getCreatedAt()); + } + else + { + dateDisplay = Util.getPrettyDate(directMessage.getCreatedAt()); + } + } + + prettyDateTextView.setText(dateDisplay); } mAvatar = (QuickContactDivot) findViewById(R.id.avatar); diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/SettingsActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/SettingsActivity.java index 15f008db..c4644e2c 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/SettingsActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/SettingsActivity.java @@ -58,6 +58,7 @@ public class SettingsActivity extends PreferenceActivity implements public static final String KEY_THEME_PREFERENCE = "theme_preference"; public static final String KEY_CUSTOMIZE_LANES_PREFERENCE = "customizelanes_preference"; public static final String KEY_SHOW_TABLET_MARGIN_PREFERENCE = "showtabletmargin_preference"; + public static final String KEY_DISPLAY_TIME_PREFERENCE = "displaytime_preference"; public static final String KEY_STATUS_SIZE_PREFERENCE = "statussize_preference"; public static final String KEY_PROFILE_IMAGE_SIZE_PREFERENCE = "profileimagesize_preference"; public static final String KEY_VOLSCROLL_PREFERENCE = "volscroll_preference"; @@ -76,6 +77,7 @@ public class SettingsActivity extends PreferenceActivity implements private ListPreference mThemePreference; private CheckBoxPreference mShowTabletMarginPreference; private ListPreference mStatusSizePreference; + private ListPreference mDisplayTimePreference; private ListPreference mProfileImageSizePreference; private CheckBoxPreference mDownloadImagesPreference; private CheckBoxPreference mShowTweetSourcePreference; @@ -133,6 +135,8 @@ protected void onCreate(Bundle savedInstanceState) { mShowTabletMarginPreference = null; } + mDisplayTimePreference = (ListPreference) getPreferenceScreen() + .findPreference(KEY_DISPLAY_TIME_PREFERENCE); mStatusSizePreference = (ListPreference) getPreferenceScreen() .findPreference(KEY_STATUS_SIZE_PREFERENCE); mProfileImageSizePreference = (ListPreference) getPreferenceScreen() @@ -222,6 +226,11 @@ protected void onResume() { mShowTabletMarginPreference.setChecked(showTabletMargin); } + if (mDisplayTimePreference.getEntry() == null) { + mDisplayTimePreference.setValueIndex(0); + } + mDisplayTimePreference.setSummary(mDisplayTimePreference.getEntry()); + if (mStatusSizePreference.getEntry() == null) { mStatusSizePreference.setValueIndex(2); } diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedItemView.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedItemView.java index 207f1054..fce761e4 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedItemView.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedItemView.java @@ -51,6 +51,11 @@ import org.tweetalib.android.model.TwitterMediaEntity.Size; import org.tweetalib.android.model.TwitterStatus; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + public class TweetFeedItemView extends LinearLayout { private Context mContext; @@ -253,8 +258,29 @@ public void onClick(View v) { TextView prettyDateTextView = (TextView) findViewById(R.id.pretty_date); if (prettyDateTextView != null) { - prettyDateTextView.setText(Util - .getPrettyDate(mTwitterStatus.mCreatedAt)); + + String dateDisplay; + + AppSettings.DisplayTimeFormat displayTimeFormat = AppSettings.get().getCurrentDisplayTimeFormat(); + if(displayTimeFormat== AppSettings.DisplayTimeFormat.Relative){ + dateDisplay = Util.getPrettyDate(mTwitterStatus.mCreatedAt); + }else if(displayTimeFormat== AppSettings.DisplayTimeFormat.Absolute){ + dateDisplay = Util.getShortDate(mTwitterStatus.mCreatedAt); + } else{ + int diffInMinutes = (int)((new Date().getTime() - mTwitterStatus.mCreatedAt.getTime()) / (1000 * 60)); + if(diffInMinutes > 59) + { + dateDisplay = Util.getShortDate(mTwitterStatus.mCreatedAt); + } + else + { + dateDisplay = Util.getPrettyDate(mTwitterStatus.mCreatedAt); + } + } + + prettyDateTextView.setText(dateDisplay); + + } TextView fullDateTextView = (TextView) findViewById(R.id.full_date); From ea955f8450b1f3fe8860545318ef98f906d4b0a8 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Mon, 26 Aug 2013 14:32:57 +0100 Subject: [PATCH 103/163] Changes to make date formatting standard in one place. Also change logic to include date if over 1 day, and year if over 300 days --- .../tweetlanes/android/core/util/Util.java | 59 ++++++++++++++++++- .../core/view/DirectMessageItemView.java | 23 +------- .../android/core/view/TweetFeedItemView.java | 24 +------- 3 files changed, 60 insertions(+), 46 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/util/Util.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/util/Util.java index 671a0dad..8301e42d 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/util/Util.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/util/Util.java @@ -19,6 +19,8 @@ import android.os.Environment; import android.util.DisplayMetrics; +import com.tweetlanes.android.core.AppSettings; + import java.io.File; import java.net.MalformedURLException; import java.net.Proxy; @@ -46,12 +48,45 @@ public static String getFullDate(Date date) { return formatted.format(date); } - public static String getShortDate(Date date) { + private static String getShortDateYear(Date date) { + SimpleDateFormat formatted = new SimpleDateFormat( + "dd MMM yy, hh:mm aa"); + return formatted.format(date); + } + + private static String getShortDate(Date date) { + SimpleDateFormat formatted = new SimpleDateFormat( + "dd MMM, hh:mm aa"); + return formatted.format(date); + } + + private static String getTimeOnly(Date date) { SimpleDateFormat formatted = new SimpleDateFormat( "hh:mm aa"); return formatted.format(date); } + public static String getDisplayDate(Date date) + { + AppSettings.DisplayTimeFormat displayTimeFormat = AppSettings.get().getCurrentDisplayTimeFormat(); + if(displayTimeFormat== AppSettings.DisplayTimeFormat.Relative){ + return Util.getPrettyDate(date); + }else if(displayTimeFormat== AppSettings.DisplayTimeFormat.Absolute){ + return getPrettyFullDate(date); + } else{ + Date currentDate = new Date(); + int diffInMinutes = (int)((currentDate.getTime() - date.getTime()) / (1000 * 60)); + if(diffInMinutes > 59) + { + return getPrettyFullDate(date); + } + else + { + return Util.getPrettyDate(date); + } + } + } + /* * Given 1234567890, return "1,234,567,890" */ @@ -60,6 +95,28 @@ public static String getPrettyCount(int count) { return Integer.toString(count).replaceAll(regex, "$1,"); } + + public static String getPrettyFullDate(Date date) + { + Date currentDate = new Date(); + int diffInDays = (int) ((currentDate.getTime() - date.getTime()) / (1000 * 60 * 60 * 24)); + if(diffInDays > 0) + { + if(diffInDays > 300) + { + return Util.getShortDateYear(date); + } + else + { + return Util.getShortDate(date); + } + } + else + { + return Util.getTimeOnly(date); + } + } + /* * */ diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/DirectMessageItemView.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/DirectMessageItemView.java index 1a7cd84f..55c027eb 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/DirectMessageItemView.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/DirectMessageItemView.java @@ -176,28 +176,7 @@ public void configure(String userScreenName, TextView prettyDateTextView = (TextView) findViewById(R.id.pretty_date); if (prettyDateTextView != null) { - String dateDisplay; - - AppSettings.DisplayTimeFormat displayTimeFormat = AppSettings.get().getCurrentDisplayTimeFormat(); - if(displayTimeFormat== AppSettings.DisplayTimeFormat.Relative){ - dateDisplay = Util.getPrettyDate(directMessage.getCreatedAt()); - }else if(displayTimeFormat== AppSettings.DisplayTimeFormat.Absolute){ - DateFormat df = new SimpleDateFormat("d MMM, HH:mm"); - dateDisplay = df.format(directMessage.getCreatedAt()); - } else{ - int diffInMinutes = (int)((new Date().getTime() - directMessage.getCreatedAt().getTime()) / (1000 * 60)); - if(diffInMinutes > 59) - { - DateFormat df = new SimpleDateFormat("d MMM, HH:mm"); - dateDisplay = df.format(directMessage.getCreatedAt()); - } - else - { - dateDisplay = Util.getPrettyDate(directMessage.getCreatedAt()); - } - } - - prettyDateTextView.setText(dateDisplay); + prettyDateTextView.setText(Util.getDisplayDate(directMessage.getCreatedAt())); } mAvatar = (QuickContactDivot) findViewById(R.id.avatar); diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedItemView.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedItemView.java index fce761e4..ee958108 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedItemView.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedItemView.java @@ -258,29 +258,7 @@ public void onClick(View v) { TextView prettyDateTextView = (TextView) findViewById(R.id.pretty_date); if (prettyDateTextView != null) { - - String dateDisplay; - - AppSettings.DisplayTimeFormat displayTimeFormat = AppSettings.get().getCurrentDisplayTimeFormat(); - if(displayTimeFormat== AppSettings.DisplayTimeFormat.Relative){ - dateDisplay = Util.getPrettyDate(mTwitterStatus.mCreatedAt); - }else if(displayTimeFormat== AppSettings.DisplayTimeFormat.Absolute){ - dateDisplay = Util.getShortDate(mTwitterStatus.mCreatedAt); - } else{ - int diffInMinutes = (int)((new Date().getTime() - mTwitterStatus.mCreatedAt.getTime()) / (1000 * 60)); - if(diffInMinutes > 59) - { - dateDisplay = Util.getShortDate(mTwitterStatus.mCreatedAt); - } - else - { - dateDisplay = Util.getPrettyDate(mTwitterStatus.mCreatedAt); - } - } - - prettyDateTextView.setText(dateDisplay); - - + prettyDateTextView.setText(Util.getDisplayDate(mTwitterStatus.mCreatedAt)); } TextView fullDateTextView = (TextView) findViewById(R.id.full_date); From ebd09bf4d6af955774e8309dea02ea73b858b90b Mon Sep 17 00:00:00 2001 From: Jason Famularo Date: Mon, 26 Aug 2013 12:30:24 -0400 Subject: [PATCH 104/163] version beta --- android/clientbeta/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/clientbeta/AndroidManifest.xml b/android/clientbeta/AndroidManifest.xml index 9aa0cb0b..b2b4ec27 100644 --- a/android/clientbeta/AndroidManifest.xml +++ b/android/clientbeta/AndroidManifest.xml @@ -2,7 +2,7 @@ + android:versionName="1.2.1_b1"> From a8ccea3e17f578e2d85adb6193a9c242ab8b8eb3 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Tue, 27 Aug 2013 06:48:55 +0100 Subject: [PATCH 105/163] fix for #253 Change when the RT pressed icon changes so when you get the unable to un retweet it doesn't change the icon. --- .../core/view/TweetSpotlightActivity.java | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetSpotlightActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetSpotlightActivity.java index b02e005b..42ac7222 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetSpotlightActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetSpotlightActivity.java @@ -197,7 +197,7 @@ protected ComposeTweetDefault getComposeTweetDefault() { } /* - * + * */ void onGetStatus(TwitterStatus status) { mStatus = new TwitterStatus(status); @@ -254,11 +254,6 @@ public boolean onOptionsItemSelected(MenuItem item) { */ } else if (i == R.id.action_retweet) { - boolean isDarkTheme = AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Dark || AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Light_DarkAction; - mRetweetMenuItem - .setIcon(isDarkTheme ? R.drawable.ic_action_rt_pressed_dark - : R.drawable.ic_action_rt_pressed_light); - TwitterFetchStatus.FinishedCallback callback = TwitterManager.get() .getFetchStatusInstance().new FinishedCallback() { @@ -266,8 +261,7 @@ public boolean onOptionsItemSelected(MenuItem item) { public void finished(TwitterFetchResult result, TwitterStatus status) { boolean isDarkTheme = AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Dark || AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Light_DarkAction; - mRetweetMenuItem.setIcon( - isDarkTheme ? R.drawable.ic_action_rt_off_dark : R.drawable.ic_action_rt_off_light); + mRetweetMenuItem.setIcon(isDarkTheme ? R.drawable.ic_action_rt_off_dark : R.drawable.ic_action_rt_off_light); mRetweetMenuItem.setTitle(R.string.action_retweet); if (result != null && result.isSuccessful()) { @@ -277,8 +271,7 @@ public void finished(TwitterFetchResult result, TwitterStatus status) { showToast(getString(R.string.retweeted_successfully)); setIsRetweeted(); } else { - if(!result.getErrorMessage().equals("CancelPressed") && !result.getErrorMessage().equals("QutotePressed")) - { + if (!result.getErrorMessage().equals("CancelPressed") && !result.getErrorMessage().equals("QutotePressed")) { showToast(getString(R.string.retweeted_un_successful)); } } @@ -292,6 +285,9 @@ public void finished(TwitterFetchResult result, TwitterStatus status) { if (mStatus.mIsRetweetedByMe) { showToast(getString(R.string.cannot_unretweet)); } else { + boolean isDarkTheme = AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Dark || AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Light_DarkAction; + mRetweetMenuItem.setIcon(isDarkTheme ? R.drawable.ic_action_rt_pressed_dark : R.drawable.ic_action_rt_pressed_light); + retweetSelected(mStatus, callback); } From 4cff05c9586de668fb57cf9f8cf8955a2735d05b Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Tue, 27 Aug 2013 07:16:12 +0100 Subject: [PATCH 106/163] Fix for #255 Since this comes back from an async callback, it's possible the screen is rotated etc. Therefore i've added an overide for the detached function, and the updateheading is only called when it's attached. Should prevent the illegal state exception --- .../android/core/view/TweetFeedFragment.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index 5d5fd22d..a0de73d1 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -103,6 +103,7 @@ public void addValues(Bundle args) { private TextView mListHeadingTextView; private ImageView mListHeadingHideImage; private boolean mHidingListHeading = false; + private boolean mDetached = false; private TwitterContentHandle mContentHandle; private TwitterStatuses _mStatusFeed; // Don't touch me directly. Use the // accessors @@ -194,6 +195,12 @@ public void onSaveInstanceState(Bundle state) { state.putBoolean("HidingListHeading", mHidingListHeading); } + @Override + public void onDetach () + { + mDetached = true; + } + /* * */ @@ -885,7 +892,10 @@ private void onRefreshFinished(TwitterStatuses feed) { mLastTwitterStatusIdSeen = visibleStatus.mId; } - updateListHeading(statusIndex.intValue() + 1); + if(!mDetached) + { + updateListHeading(statusIndex.intValue() + 1); + } } else { showToast(getString(R.string.lost_position)); } From 63b04415cd549164a0d3b7c3049f7e99f9c3b295 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Tue, 27 Aug 2013 07:37:54 +0100 Subject: [PATCH 107/163] Tweaking previous commits following a bit more testing --- .../com/tweetlanes/android/core/view/TweetFeedFragment.java | 1 + .../tweetlanes/android/core/view/TweetSpotlightActivity.java | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index a0de73d1..d26f91da 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -198,6 +198,7 @@ public void onSaveInstanceState(Bundle state) { @Override public void onDetach () { + super.onDetach(); mDetached = true; } diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetSpotlightActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetSpotlightActivity.java index 42ac7222..2e1cbeed 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetSpotlightActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetSpotlightActivity.java @@ -260,9 +260,7 @@ public boolean onOptionsItemSelected(MenuItem item) { @Override public void finished(TwitterFetchResult result, TwitterStatus status) { - boolean isDarkTheme = AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Dark || AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Light_DarkAction; - mRetweetMenuItem.setIcon(isDarkTheme ? R.drawable.ic_action_rt_off_dark : R.drawable.ic_action_rt_off_light); - mRetweetMenuItem.setTitle(R.string.action_retweet); + setIsRetweeted(); if (result != null && result.isSuccessful()) { if (status != null && status.mOriginalRetweetId > 0) { @@ -284,6 +282,7 @@ public void finished(TwitterFetchResult result, TwitterStatus status) { if (mStatus.mIsRetweetedByMe) { showToast(getString(R.string.cannot_unretweet)); + setIsRetweeted(); } else { boolean isDarkTheme = AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Dark || AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Light_DarkAction; mRetweetMenuItem.setIcon(isDarkTheme ? R.drawable.ic_action_rt_pressed_dark : R.drawable.ic_action_rt_pressed_light); From 0088acf57ffdc5efa9135a046f3672fbcf787529 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Tue, 27 Aug 2013 20:27:36 +0100 Subject: [PATCH 108/163] Change calculation of diffInDays to only count whole days. So messages yesterday will include the date, rather than messages 24 hours ago. --- .../tweetlanes/android/core/util/Util.java | 22 ++++++------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/util/Util.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/util/Util.java index 8301e42d..1aa03041 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/util/Util.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/util/Util.java @@ -32,37 +32,27 @@ public final class Util { - /* - * - */ public static boolean isValidString(String s) { return s != null && !s.equals(""); } - /* - * - */ public static String getFullDate(Date date) { - SimpleDateFormat formatted = new SimpleDateFormat( - "hh:mm aa - dd MMM yy"); + SimpleDateFormat formatted = new SimpleDateFormat("hh:mm aa - dd MMM yy"); return formatted.format(date); } private static String getShortDateYear(Date date) { - SimpleDateFormat formatted = new SimpleDateFormat( - "dd MMM yy, hh:mm aa"); + SimpleDateFormat formatted = new SimpleDateFormat("dd MMM yy, hh:mm aa"); return formatted.format(date); } private static String getShortDate(Date date) { - SimpleDateFormat formatted = new SimpleDateFormat( - "dd MMM, hh:mm aa"); + SimpleDateFormat formatted = new SimpleDateFormat("dd MMM, hh:mm aa"); return formatted.format(date); } private static String getTimeOnly(Date date) { - SimpleDateFormat formatted = new SimpleDateFormat( - "hh:mm aa"); + SimpleDateFormat formatted = new SimpleDateFormat("hh:mm aa"); return formatted.format(date); } @@ -99,7 +89,9 @@ public static String getPrettyCount(int count) { public static String getPrettyFullDate(Date date) { Date currentDate = new Date(); - int diffInDays = (int) ((currentDate.getTime() - date.getTime()) / (1000 * 60 * 60 * 24)); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); + int diffInDays = sdf.format(currentDate).compareTo(sdf.format(date)); + if(diffInDays > 0) { if(diffInDays > 300) From 5ec3c8cd25ab666a2ac426361e00aa4557b063c5 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Mon, 2 Sep 2013 07:20:50 +0100 Subject: [PATCH 109/163] Fix for #259. Reorder this bit of the function. I've previously made changes to the sub function which could impact the order things need to run in. --- .../com/tweetlanes/android/core/view/TweetFeedFragment.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index d26f91da..0cfc657f 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -222,13 +222,12 @@ private void configureInitialStatuses() { updateViewVisibility(false); setInitialDownloadState(InitialDownloadState.WAITING); } else { + setInitialDownloadState(InitialDownloadState.DOWNLOADED); + updateViewVisibility(true); if (autoUpdateStatuses) { fetchNewestTweets(); } - - setInitialDownloadState(InitialDownloadState.DOWNLOADED); - updateViewVisibility(true); } } From 7e9e21bdd47db895f0c297551c280f0fd5421f45 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Mon, 2 Sep 2013 07:22:52 +0100 Subject: [PATCH 110/163] Fix for #258. Ensure there is enough items in the status' to return one return null --- .../src/org/tweetalib/android/model/TwitterStatuses.java | 5 +++++ .../com/tweetlanes/android/core/view/TweetFeedFragment.java | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatuses.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatuses.java index 2566ba9d..917f1949 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatuses.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatuses.java @@ -485,6 +485,11 @@ private int size() { } private TwitterStatus get(int index) { + + if(index >= _mStatuses.size()){ + return null; + } + return _mStatuses.get(index); } diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index 0cfc657f..ebe1ebd2 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -774,7 +774,7 @@ void updateListHeading(int firstVisibleItem) { if (mTwitterStatusIdWhenRefreshed != null && mTwitterStatusIdWhenRefreshed > 0 && firstVisibleItem > 0) { if (!mHidingListHeading) { TwitterStatus status = getStatusFeed().getStatus(firstVisibleItem); - if ((mNewStatuses == 0 || status.mId >= mTwitterStatusIdWhenRefreshed) && status.mId >= mLastTwitterStatusIdSeen) { + if (status != null && (mNewStatuses == 0 || status.mId >= mTwitterStatusIdWhenRefreshed) && status.mId >= mLastTwitterStatusIdSeen) { mNewStatuses = firstVisibleItem; mLastTwitterStatusIdSeen = status.mId; } From a5f20c6bd1ae25672f4e012805d1fea24acd2efd Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Mon, 2 Sep 2013 07:24:05 +0100 Subject: [PATCH 111/163] Fix for #257. Only put the status in if we have a status, if not, then it's an empty string. Added a check after pulling string out to ensure it's not empty. --- .../android/core/view/BaseLaneActivity.java | 21 +++++++++++-------- .../core/view/TweetSpotlightActivity.java | 7 ++++++- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java index ee4bf32d..6d688caf 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java @@ -1048,15 +1048,18 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { } } String statusAsString = data.getStringExtra("status"); - TwitterStatus status = new TwitterStatus(statusAsString); - BaseLaneFragment fragment = mLaneFragmentHashMap - .get(getCurrentLaneIndex()); - // fragment will be null if the user scrolls the Tabs to a Fragment not - // yet created. - // In that instance, the download will be triggered in - // onLaneFragmentDownloadStateChanged(). - if (fragment != null) { - fragment.UpdateTweetCache(status, deleteStatus); + if(!statusAsString.isEmpty()) + { + TwitterStatus status = new TwitterStatus(statusAsString); + BaseLaneFragment fragment = mLaneFragmentHashMap + .get(getCurrentLaneIndex()); + // fragment will be null if the user scrolls the Tabs to a Fragment not + // yet created. + // In that instance, the download will be triggered in + // onLaneFragmentDownloadStateChanged(). + if (fragment != null) { + fragment.UpdateTweetCache(status, deleteStatus); + } } diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetSpotlightActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetSpotlightActivity.java index 2e1cbeed..252a6dca 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetSpotlightActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetSpotlightActivity.java @@ -103,7 +103,12 @@ public void finished(TwitterFetchResult result, } } else { Intent returnIntent = new Intent(); - returnIntent.putExtra("status", mStatus.toString()); + if(mStatus!=null){ + returnIntent.putExtra("status", mStatus.toString()); + } + else{ + returnIntent.putExtra("status", ""); + } setResult(RESULT_OK, returnIntent); finish(); } From 3640a550afa5a7e3cafb489093f515e8669d9e85 Mon Sep 17 00:00:00 2001 From: James Duffy Date: Mon, 2 Sep 2013 00:16:16 -0700 Subject: [PATCH 112/163] Changed profile filler text to placeholder text On a slow network the filler text was showing up before being replaced by the person's bio. --- android/libraries/TweetLanesCore/res/layout/profile.xml | 2 +- android/libraries/TweetLanesCore/res/layout/profile_adn.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/android/libraries/TweetLanesCore/res/layout/profile.xml b/android/libraries/TweetLanesCore/res/layout/profile.xml index 69e96132..4a088ef0 100644 --- a/android/libraries/TweetLanesCore/res/layout/profile.xml +++ b/android/libraries/TweetLanesCore/res/layout/profile.xml @@ -108,7 +108,7 @@ android:paddingRight="20dip" android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="The person's bio goes here. It could be anywhere up to 160 characters in length, which is anywhere up to and including the length of this wordly, informative string" + android:text="Loading bio..." android:linksClickable="true" /> diff --git a/android/libraries/TweetLanesCore/res/layout/profile_adn.xml b/android/libraries/TweetLanesCore/res/layout/profile_adn.xml index 865c7cc9..50236c5a 100644 --- a/android/libraries/TweetLanesCore/res/layout/profile_adn.xml +++ b/android/libraries/TweetLanesCore/res/layout/profile_adn.xml @@ -117,7 +117,7 @@ android:paddingRight="20dip" android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="The person's bio goes here. It could be anywhere up to 160 characters in length, which is anywhere up to and including the length of this wordly, informative string" + android:text="Loading bio..." android:linksClickable="true" /> From 727a7053669347f8b89068fde8fe2e48e5bee527 Mon Sep 17 00:00:00 2001 From: Andrew Neal Date: Thu, 5 Sep 2013 15:37:27 -0500 Subject: [PATCH 113/163] Fix several leaks. --- .../android/core/util/LazyImageLoader.java | 18 ++++++++++++------ .../tweetlanes/android/core/util/Util.java | 19 +++++++++++++++++++ .../urlimageviewhelper/HttpUrlDownloader.java | 13 ++++++++++--- 3 files changed, 41 insertions(+), 9 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/util/LazyImageLoader.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/util/LazyImageLoader.java index 1e025d78..2dba9ade 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/util/LazyImageLoader.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/util/LazyImageLoader.java @@ -141,11 +141,14 @@ private void copyStream(InputStream is, OutputStream os) { // decodes image and scales it to reduce memory consumption private Bitmap decodeFile(File f) { + InputStream enter = null; + InputStream exit = null; try { // decode image size + enter = new FileInputStream(f); final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; - BitmapFactory.decodeStream(new FileInputStream(f), null, options); + BitmapFactory.decodeStream(enter, null, options); // Find the correct scale value. It should be the power of 2. int width_tmp = options.outWidth, height_tmp = options.outHeight; @@ -158,10 +161,10 @@ private Bitmap decodeFile(File f) { } // decode with inSampleSize + exit = new FileInputStream(f); final BitmapFactory.Options o2 = new BitmapFactory.Options(); o2.inSampleSize = scale; - final Bitmap bitmap = BitmapFactory.decodeStream( - new FileInputStream(f), null, o2); + final Bitmap bitmap = BitmapFactory.decodeStream(exit, null, o2); if (bitmap == null) { // The file is corrupted, so we remove it from cache. if (f.isFile()) { @@ -171,6 +174,9 @@ private Bitmap decodeFile(File f) { return bitmap; } catch (final FileNotFoundException e) { // e.printStackTrace(); + } finally { + Util.closeQuietly(enter); + Util.closeQuietly(exit); } return null; } @@ -345,16 +351,16 @@ private Bitmap DownloadBitmapFromWeb(URL url, File f, Boolean isRetry) { final InputStream is = conn.getInputStream(); final OutputStream os = new FileOutputStream(f); copyStream(is, os); + is.close(); os.close(); bitmap = decodeFile(f); - int bitmapBytes = bitmap.getByteCount(); + final int bitmapBytes = bitmap.getByteCount(); if (bitmapBytes == 0) { if (isRetry) { return null; - } else { - return DownloadBitmapFromWeb(url, f, true); } + return DownloadBitmapFromWeb(url, f, true); } mFileCache.saveFile(bitmap, url); return bitmap; diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/util/Util.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/util/Util.java index 1aa03041..d37fffb8 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/util/Util.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/util/Util.java @@ -21,7 +21,9 @@ import com.tweetlanes.android.core.AppSettings; +import java.io.Closeable; import java.io.File; +import java.io.IOException; import java.net.MalformedURLException; import java.net.Proxy; import java.net.URL; @@ -320,4 +322,21 @@ private static File getAlbumStorageDir(String albumName) { .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), albumName); } + + /** + * Close the {@link Closeable} ignoring any {@link IOException} + * + * @param closeable The {@link Closeable} to close + */ + public static void closeQuietly(Closeable closeable) { + if (closeable != null) { + try { + closeable.close(); + closeable = null; + } catch (final IOException ignored) { + // Nothing to do + } + } + } + } diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/urlimageviewhelper/HttpUrlDownloader.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/urlimageviewhelper/HttpUrlDownloader.java index 3662c708..311bcb0f 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/urlimageviewhelper/HttpUrlDownloader.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/urlimageviewhelper/HttpUrlDownloader.java @@ -1,8 +1,10 @@ + package com.tweetlanes.android.core.widget.urlimageviewhelper; import android.content.Context; import android.os.AsyncTask; +import com.tweetlanes.android.core.util.Util; import com.tweetlanes.android.core.widget.urlimageviewhelper.UrlImageViewHelper.RequestPropertiesCallback; import org.apache.http.NameValuePair; @@ -20,11 +22,10 @@ public void download(final Context context, final String url, final String filen final AsyncTask downloader = new AsyncTask() { @Override protected Void doInBackground(final Void... params) { + HttpURLConnection urlConnection = null; + InputStream is = null; try { - InputStream is; - String thisUrl = url; - HttpURLConnection urlConnection; while (true) { final URL u = new URL(thisUrl); urlConnection = (HttpURLConnection) u.openConnection(); @@ -54,6 +55,12 @@ protected Void doInBackground(final Void... params) { } catch (final Throwable e) { e.printStackTrace(); return null; + } finally { + if (urlConnection != null) { + urlConnection.disconnect(); + urlConnection = null; + } + Util.closeQuietly(is); } } From 1715dfd695b1ece5efcd5d3e377ab03c901bfa2a Mon Sep 17 00:00:00 2001 From: Andrew Neal Date: Thu, 5 Sep 2013 17:14:04 -0500 Subject: [PATCH 114/163] Make the ActionBar title selectable in the ProfileActivity Make the ActionBar title, including "up" affordance, selectable in the ProfileActivity. --- .../res/layout/profile_title_thin.xml | 31 ++++------------ .../android/core/view/ProfileActivity.java | 36 +++++-------------- 2 files changed, 16 insertions(+), 51 deletions(-) diff --git a/android/libraries/TweetLanesCore/res/layout/profile_title_thin.xml b/android/libraries/TweetLanesCore/res/layout/profile_title_thin.xml index 9eafb40b..7fceb01c 100644 --- a/android/libraries/TweetLanesCore/res/layout/profile_title_thin.xml +++ b/android/libraries/TweetLanesCore/res/layout/profile_title_thin.xml @@ -1,25 +1,8 @@ - - - - - - - - \ No newline at end of file + diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ProfileActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ProfileActivity.java index 0f7cfc92..8fb46b1b 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ProfileActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/ProfileActivity.java @@ -11,7 +11,6 @@ package com.tweetlanes.android.core.view; -import com.tweetlanes.android.core.AppSettings; import android.app.ActionBar; import android.content.Context; import android.content.Intent; @@ -26,7 +25,6 @@ import android.view.MenuItem; import android.view.View; import android.widget.ImageView; -import android.widget.TextView; import android.widget.ViewSwitcher; import com.tweetlanes.android.core.R; @@ -227,15 +225,15 @@ void configureActionBarView() { if (mScreenName != null) { - ActionBar actionBar = getActionBar(); + final ActionBar actionBar = getActionBar(); actionBar.setDisplayUseLogoEnabled(true); actionBar.setDisplayHomeAsUpEnabled(true); - actionBar.setDisplayShowTitleEnabled(false); + actionBar.setDisplayShowTitleEnabled(true); + actionBar.setTitle("@" + mScreenName); - LayoutInflater inflator = (LayoutInflater) this - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + final LayoutInflater inflator = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); - int layout = R.layout.profile_title_thin; + final int layout = R.layout.profile_title_thin; /* * // TODO: This is messy, and likely won't work for large screen * devices. Need to come up with a better solution int layout; if @@ -245,28 +243,12 @@ void configureActionBarView() { * R.layout.profile_title; } */ - View profileTitleView = inflator.inflate(layout, null); - ((TextView) profileTitleView.findViewById(R.id.screenname)) - .setText("@" + mScreenName); - - if(AppSettings.get().getCurrentThemeStyle() == R.style.Theme_TweetLanes_Light_DarkActionBar){ - ((TextView) profileTitleView.findViewById(R.id.screenname)).setTextColor(getResources().getColor(R.color.white)); - } - - TextView fullNameTextView = (TextView) profileTitleView - .findViewById(R.id.fullname); - if (fullNameTextView != null && mUser != null) { - fullNameTextView.setText(mUser.getName()); - } - - ImageView verifiedImage = (ImageView) profileTitleView - .findViewById(R.id.verifiedImage); - verifiedImage - .setVisibility(mUser != null && mUser.getVerified() ? View.VISIBLE - : View.GONE); + final View abView = inflator.inflate(layout, null); + final ImageView verified = (ImageView) abView.findViewById(R.id.verifiedImage); + verified.setVisibility(mUser != null && mUser.getVerified() ? View.VISIBLE : View.GONE); actionBar.setDisplayShowCustomEnabled(true); - actionBar.setCustomView(profileTitleView); + actionBar.setCustomView(abView); } } From 420c69380def81bf39501c889ddcea84d17bb229 Mon Sep 17 00:00:00 2001 From: Andrew Neal Date: Thu, 5 Sep 2013 19:07:32 -0500 Subject: [PATCH 115/163] Clean up: These should be static --- .../SocialNetLib/src/com/twitter/Extractor.java | 3 ++- .../org/tweetalib/android/model/TwitterStatus.java | 4 ++-- .../android/model/TwitterStatusUpdate.java | 13 +++++++------ .../android/core/dashclock/TweetLanesExtension.java | 4 ++-- .../android/core/util/LazyImageLoader.java | 8 +++++--- .../tweetlanes/android/core/view/AlarmReceiver.java | 4 ++-- .../android/core/view/BaseLaneActivity.java | 12 +++++++----- .../widget/pulltorefresh/PullToRefreshBase.java | 2 +- .../widget/urlimageviewhelper/DiskLruCache.java | 2 +- 9 files changed, 29 insertions(+), 23 deletions(-) diff --git a/android/libraries/SocialNetLib/src/com/twitter/Extractor.java b/android/libraries/SocialNetLib/src/com/twitter/Extractor.java index 4c0ced4a..2f0c4f5a 100755 --- a/android/libraries/SocialNetLib/src/com/twitter/Extractor.java +++ b/android/libraries/SocialNetLib/src/com/twitter/Extractor.java @@ -123,9 +123,10 @@ public void setExpandedURL(String expandedURL) { public Extractor() { } - private void removeOverlappingEntities(List entities) { + private static void removeOverlappingEntities(List entities) { // sort by index Collections.sort(entities, new Comparator() { + @Override public int compare(Entity e1, Entity e2) { return e1.start - e2.start; } diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatus.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatus.java index fb0e4850..7c5c5bf7 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatus.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatus.java @@ -551,7 +551,7 @@ public int compareTo(TwitterStatus other) { /* * */ - private boolean compareString(String string1, String string2) { + private static boolean compareString(String string1, String string2) { if (string1 == null) { if (string2 == null) { return true; @@ -565,7 +565,7 @@ private boolean compareString(String string1, String string2) { return false; } - private boolean compareLong(Long long1, Long long2) { + private static boolean compareLong(Long long1, Long long2) { if (long1 == null) { if (long2 == null) { return true; diff --git a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatusUpdate.java b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatusUpdate.java index 8b3ef48f..943a4c8a 100644 --- a/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatusUpdate.java +++ b/android/libraries/SocialNetLib/src/org/tweetalib/android/model/TwitterStatusUpdate.java @@ -85,8 +85,7 @@ public void setMediaFilePath(String mediaFilePath) { private final Long mInReplyToStatusId; private String mMediaFilePath; - - private File getMediaFile(String mediaFilePath) throws IOException { + private static File getMediaFile(String mediaFilePath) throws IOException { if (mediaFilePath == null) { return null; @@ -108,7 +107,7 @@ private File getMediaFile(String mediaFilePath) throws IOException { return resizedFile; } - private Bitmap TryResizeImage(File originalFile) throws FileNotFoundException { + private static Bitmap TryResizeImage(File originalFile) throws FileNotFoundException { Bitmap resizeImage = null; BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; @@ -133,14 +132,16 @@ private Bitmap TryResizeImage(File originalFile) throws FileNotFoundException { options = new BitmapFactory.Options(); options.inSampleSize = scale; - resizeImage = BitmapFactory.decodeStream(new FileInputStream(originalFile), null, options); + resizeImage = BitmapFactory.decodeStream(new FileInputStream(originalFile), null, + options); } return resizeImage; } - private File SaveImage(Bitmap resizeImage) { - File path = new File(Environment.getExternalStorageDirectory(), "temp/images/Tweet Lanes"); + private static File SaveImage(Bitmap resizeImage) { + final File path = new File(Environment.getExternalStorageDirectory(), + "temp/images/Tweet Lanes"); File tempFile = null; diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/dashclock/TweetLanesExtension.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/dashclock/TweetLanesExtension.java index 926f0f07..b5a9dae2 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/dashclock/TweetLanesExtension.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/dashclock/TweetLanesExtension.java @@ -87,8 +87,8 @@ private Intent getHomeIntent(String accountKey, String type) { return intent; } - private ArrayList getAccounts(Context context) { - ArrayList accounts = new ArrayList(); + private static ArrayList getAccounts(Context context) { + final ArrayList accounts = new ArrayList(); SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); String accountIndices = preferences.getString(SharedPreferencesConstants.ACCOUNT_INDICES, null); diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/util/LazyImageLoader.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/util/LazyImageLoader.java index 1e025d78..40dcb422 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/util/LazyImageLoader.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/util/LazyImageLoader.java @@ -125,7 +125,7 @@ void displayImage(URL url, ImageView imageview) { } } - private void copyStream(InputStream is, OutputStream os) { + private static void copyStream(InputStream is, OutputStream os) { final int buffer_size = 1024; try { final byte[] bytes = new byte[buffer_size]; @@ -305,8 +305,10 @@ public void init() { } } - private String getURLFilename(URL url) { - if (url == null) return null; + private static String getURLFilename(URL url) { + if (url == null) { + return null; + } return url.toString().replaceAll("[^a-zA-Z0-9]", "_"); } diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/AlarmReceiver.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/AlarmReceiver.java index 42da5f57..c5012d86 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/AlarmReceiver.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/AlarmReceiver.java @@ -220,8 +220,8 @@ private void initSocialNetLib(SocialNetConstant.Type socialNetType, String accou mConnectionStatusCallbacks); } - private ArrayList getAccounts(Context context) { - ArrayList accounts = new ArrayList(); + private static ArrayList getAccounts(Context context) { + final ArrayList accounts = new ArrayList(); SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); String accountIndices = preferences.getString(SharedPreferencesConstants.ACCOUNT_INDICES, null); diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java index 6d688caf..77d58643 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BaseLaneActivity.java @@ -807,13 +807,14 @@ boolean composeReleaseFocus(boolean forceCleanup) { /** * Get a temporary file with a fixed (=known in advance) file name - * + * * @param context activity context * @return a temp file in the external storage in a package-specific * directory */ - private File getFixedTempFile(Context context) { - File path = new File(Environment.getExternalStorageDirectory(), "temp/images/Tweet Lanes"); + private static File getFixedTempFile(Context context) { + final File path = new File(Environment.getExternalStorageDirectory(), + "temp/images/Tweet Lanes"); path.mkdirs(); File tempFile; @@ -829,8 +830,9 @@ private File getFixedTempFile(Context context) { * @return a temp file in the external storage in a package-specific * directory */ - private File getTempFile(Context context) { - File path = new File(Environment.getExternalStorageDirectory(), "temp/images/Tweet Lanes"); + private static File getTempFile(Context context) { + final File path = new File(Environment.getExternalStorageDirectory(), + "temp/images/Tweet Lanes"); path.mkdirs(); File tempFile; diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/pulltorefresh/PullToRefreshBase.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/pulltorefresh/PullToRefreshBase.java index f0609db7..0ceeb94d 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/pulltorefresh/PullToRefreshBase.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/pulltorefresh/PullToRefreshBase.java @@ -627,7 +627,7 @@ private void init(Context context, AttributeSet attrs) { } } - private void measureView(View child) { + private static void measureView(View child) { ViewGroup.LayoutParams p = child.getLayoutParams(); if (p == null) { p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/urlimageviewhelper/DiskLruCache.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/urlimageviewhelper/DiskLruCache.java index b8d1aa60..6378c112 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/urlimageviewhelper/DiskLruCache.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/urlimageviewhelper/DiskLruCache.java @@ -695,7 +695,7 @@ void delete() throws IOException { deleteContents(directory); } - private void validateKey(String key) { + private static void validateKey(String key) { if (key.contains(" ") || key.contains("\n") || key.contains("\r")) { throw new IllegalArgumentException( "keys must not contain spaces or newlines: \"" + key + "\""); From 21e9cf240319008c2b9f895ae291f16e12cc441a Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Fri, 6 Sep 2013 07:14:01 +0100 Subject: [PATCH 116/163] Added change for #267 to get the last part for app.net, but get the bit after "status" for twitter --- .../android/core/view/BootActivity.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BootActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BootActivity.java index 175b0e4b..7961155b 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BootActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BootActivity.java @@ -87,15 +87,28 @@ void jumpToNext() { Uri uriData = getIntent().getData(); if (uriData != null) { String host = uriData.getHost(); - String statusId = uriData.getLastPathSegment(); + String statusId = ""; + finish(); if (host.contains("twitter")) { + boolean nextPartStatus = false; + for (String uriPart : uriData.getPathSegments()){ + if(nextPartStatus==true){ + statusId = uriPart; + break; + } + if(uriPart.toLowerCase().equals("status")){ + nextPartStatus = true; + } + } if (getApp().getCurrentAccount().getSocialNetType() != SocialNetConstant.Type.Twitter) { changeToFirstAccountOfType(SocialNetConstant.Type.Twitter); } } else if (host.contains("app.net")) { + statusId = uriData.getLastPathSegment(); + if (getApp().getCurrentAccount().getSocialNetType() != SocialNetConstant.Type.Appdotnet) { changeToFirstAccountOfType(SocialNetConstant.Type.Appdotnet); } From 4e79673607fbfd4677e6796d27419b01bf943399 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Fri, 6 Sep 2013 07:17:15 +0100 Subject: [PATCH 117/163] fix for #268. Don't scroll to top when refreshing on send. --- .../com/tweetlanes/android/core/view/TweetFeedFragment.java | 4 ++-- .../android/core/widget/pulltorefresh/PullToRefreshBase.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index ebe1ebd2..113abd9b 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -248,7 +248,7 @@ public void fetchNewestTweets() { */ void fetchNewestTweets(final long sinceStatusId, Long maxStatusId) { - mTweetFeedListView.setRefreshing(); + mTweetFeedListView.setRefreshing(false); if (mTweetDataRefreshCallback == null) { @@ -515,7 +515,7 @@ public void finished(TwitterFetchResult fetchResult, TwitterStatuses feed, Twitt TwitterManager.get() .triggerFetchStatuses(mContentHandle, null, mTweetDataRefreshCallback, getAsyncTaskPriorityOffset()); setInitialDownloadState(InitialDownloadState.DOWNLOADING); - mTweetFeedListView.setRefreshing(); + mTweetFeedListView.setRefreshing(true); } /* diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/pulltorefresh/PullToRefreshBase.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/pulltorefresh/PullToRefreshBase.java index f0609db7..b5f0fd93 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/pulltorefresh/PullToRefreshBase.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/widget/pulltorefresh/PullToRefreshBase.java @@ -278,7 +278,7 @@ void setRefreshingLabel(String refreshingLabel) { } } - public final void setRefreshing() { + final void setRefreshing() { this.setRefreshing(true); } @@ -288,7 +288,7 @@ public final void setRefreshing() { * * @param doScroll - true if you want to force a scroll to the Refreshing view. */ - final void setRefreshing(boolean doScroll) { + public final void setRefreshing(boolean doScroll) { if (!isRefreshing()) { setRefreshingInternal(doScroll); mState = MANUAL_REFRESHING; From db4516fbf5dd5221f8efdf404ce8bc08fff5c0b2 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Fri, 6 Sep 2013 07:22:07 +0100 Subject: [PATCH 118/163] Added extra logic to update heading to ensure the last seen statusid is correct when scrolling. I've seen examples where this has not been made correct. --- .../android/core/view/TweetFeedFragment.java | 37 ++++++++++++------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index 113abd9b..f2681854 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -196,8 +196,7 @@ public void onSaveInstanceState(Bundle state) { } @Override - public void onDetach () - { + public void onDetach() { super.onDetach(); mDetached = true; } @@ -728,7 +727,7 @@ public void finished(TwitterFetchResult result, TwitterStatuses feed, private int mNewStatuses = 0; /* - * + * */ void beginListHeadingCount() { if (mTwitterStatusIdWhenRefreshed == null) { @@ -771,9 +770,11 @@ void updateListHeading(int firstVisibleItem) { SocialNetConstant.Type socialNetType = getApp().getCurrentAccount().getSocialNetType(); + TwitterStatus status = getStatusFeed().getStatus(firstVisibleItem); + if (mTwitterStatusIdWhenRefreshed != null && mTwitterStatusIdWhenRefreshed > 0 && firstVisibleItem > 0) { if (!mHidingListHeading) { - TwitterStatus status = getStatusFeed().getStatus(firstVisibleItem); + if (status != null && (mNewStatuses == 0 || status.mId >= mTwitterStatusIdWhenRefreshed) && status.mId >= mLastTwitterStatusIdSeen) { mNewStatuses = firstVisibleItem; mLastTwitterStatusIdSeen = status.mId; @@ -786,11 +787,21 @@ void updateListHeading(int firstVisibleItem) { socialNetType == SocialNetConstant.Type.Twitter ? R.string.new_tweets : R.string.new_posts)); } else { + + if (status != null && status.mId >= mLastTwitterStatusIdSeen) { + mLastTwitterStatusIdSeen = status.mId; + } + setListHeadingVisiblilty(View.GONE); mTwitterStatusIdWhenRefreshed = null; } } } else { + + if (status != null && status.mId >= mLastTwitterStatusIdSeen) { + mLastTwitterStatusIdSeen = status.mId; + } + setListHeadingVisiblilty(View.GONE); mTwitterStatusIdWhenRefreshed = null; } @@ -892,8 +903,7 @@ private void onRefreshFinished(TwitterStatuses feed) { mLastTwitterStatusIdSeen = visibleStatus.mId; } - if(!mDetached) - { + if (!mDetached) { updateListHeading(statusIndex.intValue() + 1); } } else { @@ -1294,8 +1304,7 @@ public void finished(TwitterFetchResult result, TwitterStatus status) { showToast(getString(R.string.retweeted_marking_un_successful)); } } else { - if(!result.getErrorMessage().equals("CancelPressed") && !result.getErrorMessage().equals("QutotePressed")) - { + if (!result.getErrorMessage().equals("CancelPressed") && !result.getErrorMessage().equals("QutotePressed")) { showToast(getString(R.string.retweeted_un_successful)); } } @@ -1532,13 +1541,13 @@ void setIsFavorited(boolean favorited) { if (mFavoriteMenuItem != null) { boolean isDarkTheme = AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Dark || AppSettings.get().getCurrentTheme() == AppSettings.Theme.Holo_Light_DarkAction; if (favorited) { - mFavoriteMenuItem.setIcon( - isDarkTheme ? R.drawable.ic_action_star_on_dark : R.drawable.ic_action_star_on_light); - mFavoriteMenuItem.setTitle(R.string.action_unfavorite); + mFavoriteMenuItem.setIcon( + isDarkTheme ? R.drawable.ic_action_star_on_dark : R.drawable.ic_action_star_on_light); + mFavoriteMenuItem.setTitle(R.string.action_unfavorite); } else { - mFavoriteMenuItem.setIcon( - isDarkTheme ? R.drawable.ic_action_star_off_dark : R.drawable.ic_action_star_off_light); - mFavoriteMenuItem.setTitle(R.string.action_favorite); + mFavoriteMenuItem.setIcon( + isDarkTheme ? R.drawable.ic_action_star_off_dark : R.drawable.ic_action_star_off_light); + mFavoriteMenuItem.setTitle(R.string.action_favorite); } } } From ba269851e6dfc72a9ed147f2acedbbc3b8c322e5 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Fri, 6 Sep 2013 07:24:57 +0100 Subject: [PATCH 119/163] Added extra logic to update heading to ensure the last seen statusid is correct when scrolling. I've seen examples where this has not been made correct. --- .../android/core/view/TweetFeedFragment.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java index f2681854..5dfe300f 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/TweetFeedFragment.java @@ -770,7 +770,13 @@ void updateListHeading(int firstVisibleItem) { SocialNetConstant.Type socialNetType = getApp().getCurrentAccount().getSocialNetType(); - TwitterStatus status = getStatusFeed().getStatus(firstVisibleItem); + TwitterStatuses twitterStatuses = getStatusFeed(); + TwitterStatus status = null; + + if(twitterStatuses!=null) + { + status = twitterStatuses.getStatus(firstVisibleItem); + } if (mTwitterStatusIdWhenRefreshed != null && mTwitterStatusIdWhenRefreshed > 0 && firstVisibleItem > 0) { if (!mHidingListHeading) { @@ -791,7 +797,7 @@ void updateListHeading(int firstVisibleItem) { if (status != null && status.mId >= mLastTwitterStatusIdSeen) { mLastTwitterStatusIdSeen = status.mId; } - + setListHeadingVisiblilty(View.GONE); mTwitterStatusIdWhenRefreshed = null; } From a8bcbc2c5bc73bd8e8714a0292c1115e65d76520 Mon Sep 17 00:00:00 2001 From: Chris Blyth Date: Fri, 6 Sep 2013 07:31:46 +0100 Subject: [PATCH 120/163] Added some validation around showing the status window. Added ground work for making this code show profiles --- .../TweetLanesCore/res/values/strings.xml | 1 + .../android/core/view/BootActivity.java | 52 ++++++++++++------- 2 files changed, 33 insertions(+), 20 deletions(-) diff --git a/android/libraries/TweetLanesCore/res/values/strings.xml b/android/libraries/TweetLanesCore/res/values/strings.xml index a6e02e2a..bb05ebae 100644 --- a/android/libraries/TweetLanesCore/res/values/strings.xml +++ b/android/libraries/TweetLanesCore/res/values/strings.xml @@ -276,6 +276,7 @@ An unknown error has occurred + An error occured processing URL Unable to save image until it has finished downloading Successfully saved image diff --git a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BootActivity.java b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BootActivity.java index 7961155b..2616b62d 100644 --- a/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BootActivity.java +++ b/android/libraries/TweetLanesCore/src/com/tweetlanes/android/core/view/BootActivity.java @@ -15,12 +15,14 @@ import android.content.Intent; import android.net.Uri; import android.os.Bundle; +import android.widget.Toast; import com.crittercism.app.Crittercism; import com.tweetlanes.android.core.App; import com.tweetlanes.android.core.AppSettings; import com.tweetlanes.android.core.Constant; import com.tweetlanes.android.core.ConsumerKeyConstants; +import com.tweetlanes.android.core.R; import com.tweetlanes.android.core.model.AccountDescriptor; import org.socialnetlib.android.SocialNetConstant; @@ -87,34 +89,44 @@ void jumpToNext() { Uri uriData = getIntent().getData(); if (uriData != null) { String host = uriData.getHost(); - String statusId = ""; - finish(); - if (host.contains("twitter")) { - boolean nextPartStatus = false; - for (String uriPart : uriData.getPathSegments()){ - if(nextPartStatus==true){ - statusId = uriPart; - break; + if(uriData.getPath().contains("/status/") || uriData.getPath().contains("/post/")) + { + String statusId = ""; + + finish(); + + if (host.contains("twitter")) { + boolean nextPartStatus = false; + for (String uriPart : uriData.getPathSegments()){ + if(nextPartStatus==true){ + statusId = uriPart; + break; + } + if(uriPart.toLowerCase().equals("status")){ + nextPartStatus = true; + } } - if(uriPart.toLowerCase().equals("status")){ - nextPartStatus = true; + if (getApp().getCurrentAccount().getSocialNetType() != SocialNetConstant.Type.Twitter) { + changeToFirstAccountOfType(SocialNetConstant.Type.Twitter); } } - if (getApp().getCurrentAccount().getSocialNetType() != SocialNetConstant.Type.Twitter) { - changeToFirstAccountOfType(SocialNetConstant.Type.Twitter); - } - } - else if (host.contains("app.net")) { - statusId = uriData.getLastPathSegment(); + else if (host.contains("app.net")) { + statusId = uriData.getLastPathSegment(); - if (getApp().getCurrentAccount().getSocialNetType() != SocialNetConstant.Type.Appdotnet) { - changeToFirstAccountOfType(SocialNetConstant.Type.Appdotnet); + if (getApp().getCurrentAccount().getSocialNetType() != SocialNetConstant.Type.Appdotnet) { + changeToFirstAccountOfType(SocialNetConstant.Type.Appdotnet); + } } - } - startTweetSpotlight(statusId); + startTweetSpotlight(statusId); + } + else + { + Toast.makeText(getApplicationContext(), getString(R.string.unknown_intent), + Constant.DEFAULT_TOAST_DISPLAY_TIME).show(); + } } else if (mLastStartedClass != HomeActivity.class) { mLastStartedClass = HomeActivity.class; From 2d91e615e9da6ca4cc2f85c19eaf02e684dc1182 Mon Sep 17 00:00:00 2001 From: Andrew Neal Date: Fri, 6 Sep 2013 14:22:31 -0500 Subject: [PATCH 121/163] Significantly reduce overdraw. This change significantly reduces overdraw in any list containing tweets. --- .../libraries/TweetLanesCore/res/values/styles.xml | 11 ++++++----- .../android/core/view/TweetFeedItemView.java | 6 ++++++ 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/android/libraries/TweetLanesCore/res/values/styles.xml b/android/libraries/TweetLanesCore/res/values/styles.xml index bb877bb7..fbdb5805 100644 --- a/android/libraries/TweetLanesCore/res/values/styles.xml +++ b/android/libraries/TweetLanesCore/res/values/styles.xml @@ -114,15 +114,15 @@