From 03dccdbe435c89fde2fdd39703cbce3fca9134a1 Mon Sep 17 00:00:00 2001 From: Mariotaku Lee Date: Sat, 25 Oct 2014 18:45:50 +0800 Subject: [PATCH] trying to make twidere work with identi.ca #235 improved L compatibility --- libraries/MenuComponent | 2 +- settings.gradle | 3 +- twidere.wear/.gitignore | 1 + twidere.wear/build.gradle | 32 + twidere.wear/proguard-rules.pro | 17 + twidere.wear/src/main/AndroidManifest.xml | 23 + .../twidere/extension/wear/MainActivity.java | 24 + .../main/res/drawable-hdpi/ic_launcher.png | Bin 0 -> 7783 bytes .../main/res/drawable-mdpi/ic_launcher.png | Bin 0 -> 3760 bytes .../main/res/drawable-xhdpi/ic_launcher.png | Bin 0 -> 12356 bytes .../main/res/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 24780 bytes .../src/main/res/layout/activity_main.xml | 13 + .../main/res/layout/rect_activity_main.xml | 15 + .../main/res/layout/round_activity_main.xml | 16 + twidere.wear/src/main/res/values/strings.xml | 9 + twidere/build.gradle | 4 +- .../gallery3d/ImageViewerGLActivity.java | 10 +- .../java/org/mariotaku/twidere/Constants.java | 2 +- .../twidere/activity/FiltersActivity.java | 4 +- .../activity/support/APIEditorActivity.java | 14 +- .../support/BaseSupportThemedActivity.java | 18 + .../activity/support/ComposeActivity.java | 18 +- .../activity/support/HomeActivity.java | 14 +- .../activity/support/LinkHandlerActivity.java | 9 +- .../activity/support/SignInActivity.java | 140 ++- .../constant/SharedPreferenceConstants.java | 2 + .../AddStatusFilterDialogFragment.java | 7 +- .../fragment/support/StatusFragment.java | 8 +- .../support/UserListDetailsFragment.java | 955 +++++++-------- .../fragment/support/UserProfileFragment.java | 9 +- .../org/mariotaku/twidere/model/Account.java | 470 ++++---- .../twidere/provider/TweetStore.java | 1023 +++++++++-------- .../twidere/util/ContentValuesCreator.java | 570 ++++----- .../twidere/util/MultiSelectEventHandler.java | 5 +- .../twidere/util/SpannableStringBuilder.java | 5 - .../mariotaku/twidere/util/ThemeUtils.java | 23 + .../org/mariotaku/twidere/util/Utils.java | 46 +- .../twidere/view/TwidereMenuBar.java | 30 +- .../layout-v21/layout_home_actions_button.xml | 2 +- .../res/layout/action_item_home_actions.xml | 8 +- .../layout_api_editor_advanced_fields.xml | 88 +- .../res/layout/layout_home_actions_button.xml | 2 +- twidere/src/main/res/values/strings.xml | 1 + 43 files changed, 1956 insertions(+), 1686 deletions(-) create mode 100644 twidere.wear/.gitignore create mode 100644 twidere.wear/build.gradle create mode 100644 twidere.wear/proguard-rules.pro create mode 100644 twidere.wear/src/main/AndroidManifest.xml create mode 100644 twidere.wear/src/main/java/org/mariotaku/twidere/extension/wear/MainActivity.java create mode 100644 twidere.wear/src/main/res/drawable-hdpi/ic_launcher.png create mode 100644 twidere.wear/src/main/res/drawable-mdpi/ic_launcher.png create mode 100644 twidere.wear/src/main/res/drawable-xhdpi/ic_launcher.png create mode 100644 twidere.wear/src/main/res/drawable-xxhdpi/ic_launcher.png create mode 100644 twidere.wear/src/main/res/layout/activity_main.xml create mode 100644 twidere.wear/src/main/res/layout/rect_activity_main.xml create mode 100644 twidere.wear/src/main/res/layout/round_activity_main.xml create mode 100644 twidere.wear/src/main/res/values/strings.xml delete mode 100644 twidere/src/main/java/org/mariotaku/twidere/util/SpannableStringBuilder.java diff --git a/libraries/MenuComponent b/libraries/MenuComponent index e565ee636..42c1ffdeb 160000 --- a/libraries/MenuComponent +++ b/libraries/MenuComponent @@ -1 +1 @@ -Subproject commit e565ee636888197425aabf17c46a398544ba6dc3 +Subproject commit 42c1ffdeb547e4caa9a3a10249912b350453346e diff --git a/settings.gradle b/settings.gradle index 7bc181130..c5baa09ad 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,4 +1,5 @@ -include ':twidere', ':SlidingMenu', ':DragSortListView', ':MenuComponent', ':RefreshNow' +include ':twidere', ':twidere.wear' +include ':SlidingMenu', ':DragSortListView', ':MenuComponent', ':RefreshNow' project(':SlidingMenu').projectDir = file('libraries/SlidingMenu/library') project(':DragSortListView').projectDir = file('libraries/DragSortListView/library') diff --git a/twidere.wear/.gitignore b/twidere.wear/.gitignore new file mode 100644 index 000000000..796b96d1c --- /dev/null +++ b/twidere.wear/.gitignore @@ -0,0 +1 @@ +/build diff --git a/twidere.wear/build.gradle b/twidere.wear/build.gradle new file mode 100644 index 000000000..a8d740d42 --- /dev/null +++ b/twidere.wear/build.gradle @@ -0,0 +1,32 @@ +apply plugin: 'com.android.application' + + +android { + compileSdkVersion 20 + buildToolsVersion "21.0.2" + + defaultConfig { + applicationId "org.mariotaku.twidere" + minSdkVersion 20 + targetSdkVersion 20 + versionCode 1 + versionName "1.0" + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_7 + targetCompatibility JavaVersion.VERSION_1_7 + } + buildTypes { + release { + runProguard false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + compile 'com.google.android.support:wearable:1.0.0' + compile 'com.google.android.gms:play-services-wearable:6.1.11' +} diff --git a/twidere.wear/proguard-rules.pro b/twidere.wear/proguard-rules.pro new file mode 100644 index 000000000..bb65c6fe8 --- /dev/null +++ b/twidere.wear/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Applications/Android Studio.app/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/twidere.wear/src/main/AndroidManifest.xml b/twidere.wear/src/main/AndroidManifest.xml new file mode 100644 index 000000000..8577ea6ff --- /dev/null +++ b/twidere.wear/src/main/AndroidManifest.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + diff --git a/twidere.wear/src/main/java/org/mariotaku/twidere/extension/wear/MainActivity.java b/twidere.wear/src/main/java/org/mariotaku/twidere/extension/wear/MainActivity.java new file mode 100644 index 000000000..7ff41bdcb --- /dev/null +++ b/twidere.wear/src/main/java/org/mariotaku/twidere/extension/wear/MainActivity.java @@ -0,0 +1,24 @@ +package org.mariotaku.twidere.extension.wear; + +import android.app.Activity; +import android.os.Bundle; +import android.support.wearable.view.WatchViewStub; +import android.widget.TextView; + +public class MainActivity extends Activity { + + private TextView mTextView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + final WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub); + stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() { + @Override + public void onLayoutInflated(WatchViewStub stub) { + mTextView = (TextView) stub.findViewById(R.id.text); + } + }); + } +} diff --git a/twidere.wear/src/main/res/drawable-hdpi/ic_launcher.png b/twidere.wear/src/main/res/drawable-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..55621cc1074fe21c736a80abdd0837c4e8132bdf GIT binary patch literal 7783 zcmV-t9+=^YP)?g<1;~9oCGw1!D-}8H)=bah;<3E1ie&2rI ze&7C$w+k=k4BdTo>QI?X_Md(Ey!`pDApVm>_or$!TvT|YU&7&o*m!E(`qiB-ZFw6E z-u*d9GRXe3H-7GUI}!Tcp@-ATn>y@1mo1SDZELf5t>3}nk=JT6ckzC!CryW}3mU%s zJEUF+ZD@Oq2YU9MkiFh}ACKPWdHJ}W+a32jLsoP;K8z`mlzWA$zt`6a{eK22W0Aq9 zCF@K#H660KzOdbLG{4eqZ8UHK)CP;!UZ7lA!2EH~P!rvSij3!|&FMmY`V-WJJw)xe zYtIWm?d+7j&Yw&ESc})be(tZZ`NG(53sx9knHs5~Xwl!)^XkS2lvrV?TCv&e`$Y#V zFEs6Q8q(cet=EO(+$WfK=rQuTA0m@IKsx&YY3v5V*k$;#OPEgK&n_bL=>-8#50)K=%2ENE03- zM|glV+(ROhM*_QsV0I3Z*lCPsofylGv9UPPJytl><<`~lVCwljx4hOYIbd@?yimJp zQmo2f`Zb(hkNF+}f4Tl7E$!TsY4`3RoU28+hZNjJJf0vQ-KYc5D8^$H<1&JA2A=4I z2aXDEIQVQF_CIoFyYAWxyY4u$)=o=Sy~QT1>VQN42E^ffhp3MqBCq^D(x2W$G^J5C zt|JonNjWc2Lr|7ew1A1xO!w#E5<>7b{BROJIM(ffjxIOsdoUWi?l@!nH9Ks)WX)Q> zvb;y;UnuKTf4yHq;s$&c!2|9hXU`q-mMi2fw~~ESDKs827i!x~8)~(AR^)){O zqVJLO{3M&k&ahcHB?RJxFcT*Qf1F`K1c3Gk#94yIft*DcMJT0K2u>jgU(s<#pHC+^ zp4fNa18p~5vF*wzf@6=>r)|-E+yae<%rXB9V^+RdpJg}e1eKRt{8ztFPsdYFy>o2t z{d1Trbac7n$a61z{VW?dU+loyXC*lD%m>GXX`(_-vH+YSfF~(BDZV0*$6om3@YCt& zc;th9_oiUi%?a3kbsRQba>0%Z{y2Mk4Gw)e+H@{ND~e3Rr)#JDMGQJPo_=I^)1SZ*;S#WWwEe_~H^eeh9?D$KE*j#2bgZd?}_A zkQq4ighQEz_6I)Lf6o(N+@6BA>jdY@cx<{j8mrD&;p>~+%moPS1v<`Gq3Uy8RBSaw zUaP*4vOs&e#cw&)_=)YfF=5n~KLp()4Izix-U*Jpw;CJyZSqy5-@V>0&M z^&oXj#{T=BI6$%gz8C%Mg}ryCV$UrO#si;Uoq(<1x?kNqtIN9;lD{hy%p`2%WloPuKNnxu8hT|%eL5j*$x{n z*x>k;`E>PHVADBwY`HudpI;->{oV~bue(!BpxYC%;~H0sJGOo6hAo#|vGM#ktovpZ z)|@6dC+yLD%oa<(w8W<4A=ua1fP!WABAnv&1gO=B$>vLhIr%D?GTDGX{3Zcy_|o~^ z4QI#Q*nH8AtvhFfb?2xK*vgZ(Y{kiuSaH&VrejNSN?vu!rYG#M`iwoLj3b2; z)=}!L6~hH<&NyTBDQB!AC@W4l_JFYkHM&?r%2~93Bo=&Oj=DB8RBbmQ^%xTzBNVJM zM0S%QWOY&@D0A3%-f@bizqvFM0UdS=YdmDZnhuX(%Z`qqI%Nb+$0O15l?8<*g%u6j z8m%X62!NgFDLi$0g9B+fPI1hx2aGkAc35F?yCoX-ji4!=!!bq8=O(Dw!qsDld8_rg zK_g>{F5+vnn171W)5#%0b@)9~ZPE$|-xU9n0o7&&Jaii_O z{$&N_t1tEtmGAHu>^%woqK$14Z!g*7xu9W>4XfW{LRZ@q3-+4Ql{ck9nvr*ykrK=a znmG-A1jR@S3xZ)G?m3Vp?G|*Lg_ueU_sPM`-(xPqsohC%c5pbxDBEm^lJy2CT%(WN z7CmG(5ugQ9#Fl9zI7@|1m^CE7_q-mUNZ}?jXJ11?`B@fR+VNnr&z_r;{@SOI_>ME`+3cBf2i1M zgqj`3G)MyWg&6@eBVguYEZRSUfXHJZ-Cjs(#8Zib;aSs!VObdgx2kBEE&=AWQ@f7)CX*$kQbK(6Sv@BGJ{dKPl)JC?*Q3-PS|@p!iN ziXB^ieB{}At91?fWSN$$=Hf-4H%>o~t~&KR?BSVbvBKGBN$iWe9&Ez}m+mF)wpX&7 z^`>%&`)~V6>Nn0f7@j=t*%%K)*p5|$^%x~Mc__nurYbz=Xuv;73&H6U8jv1hOAQcT zVSuD+W2DUIVS6h|cTAa9XHn7Ex7M9@ zt3G%ygl#xGmQ`&tL&hQ_1g5HEV(<{yP8a}V`;VYy@>i(pypN&ke}7s`@9LBsGp=v#k)5u-lBD6fH- z5TpR#xFHBg9g5&gH8v?oDJ?8t+aj?}>w4u@V`2VoUK&`ClFdlf29%OgAuv_#%UGx)Oapw^LD0m5sKI8FrNFx>uC0%sWoT09^$Jtn19l+Z?nohKd9R5u#)>s z^D%3zI!*P@IVY-l9I^2N)jb!e@H;ym8&11pZKpd{9(6>YKt{0H(R1=D-R2bk*MCz!<>A`RIG!_HW{I4tpOReKGOLtRwY45_HenCr zd1N%|Aa$XX;7AcMPYS=JVQjSTXJr9NDz;I@YIo^4CKi+%IZQ**)MX1K!i)s9Q)7G- zH2VlpfK|Z?W0un_q0kYhRX%f29wVw$o%zHLz3m%pJs@X^kZl zHjRnRX4CE)PC!i?N-n!U!cB^#}x+F~Janu6)@>dCkMqqi_wuSt*~r z#EZ082eSE6%&pKtc)l)XByvE5%lu`U4iQCaKNPGaK%^WFsb~$UzL@|~OENu9?UZ9* z0czraT8&xuGHsTvQe-wtX=)`vCF;yOX6WsS1Sq4yereV+O_sMphZU~XBS{ma zP5LxQ0=30ZgvDpISEGCjhhl*84HjtK8-mY|=A(X#t2l*oASLT*V3g7v%)C_wyeXx^ zkZPZ0q@Ja6^(58tDPD>>xjLAhFqDnTwtEK`MO!NcMWuo?xqdQcxBF$|5*fO;XBvDM?iuQN?+(D(t9$Uc>mIthU*OjL3)peA z2o>uck<+Rz4y>RD4p$CWK~|G4odYirrAVxmP^wE1mLtXVcsU?Sdxx-m6#}G37mEO` zH5377aX@w2!n9b`BhDV54C@m>jeBMr9I$k z$&j>KyM~m7>Xe2OmcN1kttLQ}YQ>al#RMw1RRb04?6CcCE`d3X=P#cA2+WT+CjJwI z7kKda29A8Q3JW(+M{u;Xtos7;*{7ZFNN$`GCkMOT$QIe z%XJu6U?BnG-jzwFo>-$Tct>#sDfA7Xmc0?W1+AtmW2qK}HeET1XwZqZ1gMArMGbj8 z#@j$4rPj7Qd4W19O~Ue8rIZ%BqFRd9>eF5io4?FP*RzM>;DsKQ{F03;N?dTGICXwE z3YIyE>f!#A{11S936Qhr;Pk*Gz44S{UD?ZZ83)55<*m>ceJi0xoB2i$Z+DzLXt0IF zudJqdq1e1PT)UvvOazp^M4PUhw%8nUKoNzS%qwc>voT&$rSw{-^2GUSETd7I!0Xi9mEt`l7fa&iVaSm8800lnmfFUOqtZIFM1g7`nhk#6ClqB${Amq#@duUE2L)X?$u z65P7`9r9}e;1_LzmUWf5a_!Gq&*6@uTN(xd;pD|a>ErbANHR>=9reLK38N9xzy!dJf^NrE!J3uQ5 zP=2$ykhWNprBeQRqR#!=@aVkrwQ)T24jF$qrEjm=?Qc>Bg zj{PU=MHo-J9^%-UosgA|L0GCKw(VMp$B!TNC`yp~P7kzizq^2}l3AD$qlbknQ*rUT zlj1RtpFBcbiHWFSZqRcpIUqd|5Y=SN#Y-_QAYR*t0Cm%Z!gyJbzk&eq=9U1>t&*~7 zu{vK^j~XzbPXMjn8>d{*GU9paA_7EkQW^*l&0uq@G%=?@oq0tn3N8dFwZ@?=p;nb2 zBhGd_&8Q9$0qyy!>Sem{;0Ar-+zup_IwB<53R`xz;MT3{O;Ksw}ydSZI<-Z6!YeQu== z^NH#sK>P{hfGi%RF4SNt4Vsi*bmeL_#T7gb$TMOHbDp54om^>~6JMiB$B>!RY{yl^ zTa(OXYS?r9$AEq`L(xB;dMmc&As|VDQ|H=yyh->;Z+i0dF~W0novQ?)8y&|sBdyvI z_aELAi^rdy@|oyCbFvM26^}SlPfRHXWQfRI3y>djla8Dbt3D$nTUnrzgz7R~ad9oH zNl$E#=9cThJ5svIY}8xt^$DQQJM%v*XtB7NvOt4zI7yUV@zomC|EObj_HZ^eT#-3V z9431!Q@X7lBFj z8Z>)oQ0~*om8v6H1f)QKhUlhoKvi-;+|1LLNW{J^ZK>)n03?WjlFJFu!(RX>Rhx=b z4N5a=cZxY66NG1vz*G*%Ye?A4xzY%l#aJ((>}3RKDfM9lD6UK&o?+6p2F`E4+b4hy zoUZyyezWz}WKvL4od%^BNxM>=PEHPJ3IVbuKq*yDSt6kNUO?Jn- z*)IbWoJI=bfJ($_9X$Ucq`7}fM(|?GhS`;-Yu(%SJAvtB|xPHm>ME! zmPp=vt4{#!JGb(k{1%(bN%J+Bs2-kP6$Ge64MADTY|5O$%yE*UUP`rnN-P0NBtX0r z;6)|x-BK5;ViyPWPX_%m#SZ=w1qlS`76Foo3W_S$L}Ve&s3n$&$gvP-RF|oWGyD>C zB3}Y(lmp_cj)`^J;ySlym|l~i;RkQ_3841d?QhO&u{obqt1cu|t5f}>&Q}uY1l2Gr zLzzwP0YoX55?e`t>f~nL>qBWvG_Z1aJnlcZ{ZA|BUIitU{xqPM_0#h%be=hcz!Y_= z;x$C|M9d>kEV0Gh!Z9>q3>O?GDa`bXlTM$Vqxw9hLBhClGMDlqQCIB4VoS`J?;Nw@ zUtJ{j0^+q$&QiNWlv>?$tJJ8Dkf&Efp&9~HhY1sBD?D?YsH~i`z&$0dlB-OM@mh(u zBs|SBNJWX&I!GzG`&4Xu<2?A17NI9gS9zbzL)>J6E zFrNsWZu?0?0=%LOv;t)6CuMbJLdN0|6lOHL8Vj*yM%@uPw$Hu73?2IfP%os&9P>%D z(loDxW*KzPPL~J)$?C%NI8DJlK=py+l)*Xtn5q@QNf`~+q#%iyV!SQkX~tIoIIPfI zWlReB42gLjIDYbgSkLsf6@0(9W8+IeybtT`$8O%fhNhKe@D4S`Sib>O3@RfeOI5C* z!d^f&h|PClGonVku%Dpd$IpA(TuqJGLfZ{_i>6*GSn7K}t=9eKoGi;-LCL05`uyG1 zhzN_fJ;ODed?Iu|_l-2U>=|Nsb&|i%!BJkr{hcO>?=QVxw>mVsV5ut^xkOAcZqyu* zxB@_XGH)?8gR+LfKS7G3x^P_m{*t^~Csp+Vy8qz1SQqj8w(Mv@M9Mf!4Ic)-q~VyI zNu@=W8p86_MFnv<;RSL)F$8FOr1?|Z@q;}$0Irb8e8Ufu%AE`|>fN0a%0^j**79{FEpgz1X~SvongmRhdOQw5OKc_LD&%WEJm%7E5mX7UgS6;40+efj zsGQL(Fy4xd_a7D&6!hV5^V6>?uB{?%hf?} zx*kGOM+$+7CW23-)~4}ul;8hNe_opBcubD#p95ujC4PyjmjhEN9r8yasmuvU6%I(O zutq}pNb0D~5MOCZ12;t?k7_d{RgXY&tp$Y@WVJR(sk1|By**ND9g$2;Y*M8o;>pBg zi|i1QYlYCv5o}h9;j@`Zl8b)vn&AQc<;yMnB%|^S-i^$*wVEEQ^UODPI6^aw5I4^O zvNCt1R!l@ng&S4P&CN;`iaP_pM z;1QyXX|Y<=jZ<@(Wkt|jXli$Tm{vLQW=75A`&sp#Kjh5!xt~4XN64PGBObWV8b}@XC$OFPF)YV@ zLNNeVt^;X55O(fLY?QZhb$G6sb!5JUb4-ziv#esA>*PS)8#eBrG8=a~X2NF_gT%0P z{|uI{pD?aLmZoWp{1Sqy&f8+4t z#fxvG)Yx2`oimIDrt!LFC{@Htlp;gm;-vsvQijcVMP}wSF#6Tns=dAaO;;c7b7rGH z5Uj?31bdHxbi5+LRl?ZmN*Luch)wc05=MFa8vx2^u)7vfq{8Opt6+Av3jAfm;Ty|) zvSH*&3UHV>gpG6=^dmr>ot>{wm?=GNHU4jc)6`Efb_S_0co-&!4aXFU2|Hvp8o)Zx46GF28;q9(2%&B<3INa~oGtR^;~ zZZp*cTQ|jsR{`;_jn9ZSJu^OFpfDv|5x#NC@TcPgQ#5I>K?)qk{Gvy8kDu1h0Rea| zx6$F7m{K)?uRcZ=t08=zI(6dIf2C=_J7yU32-5Aga~~S`GwV*`H&PgGIyM5z^ zQd+7aI75>(xNlTC$5vsLmuJO=&g)q(QcVHtXo z;B-m*+!A}1SmD5A)h#D(G%!hj!JG`c zqmel-mtu0qoQ=qI-WHHx>i^FQJ$~PuLgn}4ip^6p>RophE}eFwsL}6eT8;a%hyqL3 ze*YI2e$>Dcgvk-_zU>vKtQ?eTW*C%Vr4t}C{E)W@|Jxw>?|d2*-iXT6`B+x%peCzx tRF+kmywk7$R>$w#@7wR&@7w=j`)@L)kHdOT`^^9V002ovPDHLkV1gB+{`vp_ literal 0 HcmV?d00001 diff --git a/twidere.wear/src/main/res/drawable-mdpi/ic_launcher.png b/twidere.wear/src/main/res/drawable-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..11ec2068be19999e4826062377ec8cd169c893bf GIT binary patch literal 3760 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 + + diff --git a/twidere.wear/src/main/res/layout/rect_activity_main.xml b/twidere.wear/src/main/res/layout/rect_activity_main.xml new file mode 100644 index 000000000..9cea89757 --- /dev/null +++ b/twidere.wear/src/main/res/layout/rect_activity_main.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/twidere.wear/src/main/res/layout/round_activity_main.xml b/twidere.wear/src/main/res/layout/round_activity_main.xml new file mode 100644 index 000000000..b2eed694d --- /dev/null +++ b/twidere.wear/src/main/res/layout/round_activity_main.xml @@ -0,0 +1,16 @@ + + + + + diff --git a/twidere.wear/src/main/res/values/strings.xml b/twidere.wear/src/main/res/values/strings.xml new file mode 100644 index 000000000..aefd24a73 --- /dev/null +++ b/twidere.wear/src/main/res/values/strings.xml @@ -0,0 +1,9 @@ + + + + Twidere Wear Extension + MainActivity + Hello Round World! + Hello Square World! + + diff --git a/twidere/build.gradle b/twidere/build.gradle index 60470f9a9..5962846f1 100644 --- a/twidere/build.gradle +++ b/twidere/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.application' android { compileSdkVersion 21 - buildToolsVersion '21.0.1' + buildToolsVersion '21.0.2' defaultConfig { applicationId "org.mariotaku.twidere" @@ -69,7 +69,9 @@ android { } dependencies { + wearApp project(':twidere.wear') compile 'com.android.support:support-v13:21.0.0' + compile 'com.android.support:appcompat-v7:21.0.0' compile 'com.android.support:cardview-v7:21.0.0' compile 'com.android.support:recyclerview-v7:21.0.0' compile 'com.google.android.gms:play-services:6.1.11' diff --git a/twidere/src/main/java/org/mariotaku/gallery3d/ImageViewerGLActivity.java b/twidere/src/main/java/org/mariotaku/gallery3d/ImageViewerGLActivity.java index feeec2e74..817b51fbd 100644 --- a/twidere/src/main/java/org/mariotaku/gallery3d/ImageViewerGLActivity.java +++ b/twidere/src/main/java/org/mariotaku/gallery3d/ImageViewerGLActivity.java @@ -46,6 +46,7 @@ import org.mariotaku.gallery3d.ui.SynchronizedHandler; import org.mariotaku.gallery3d.util.GalleryUtils; import org.mariotaku.gallery3d.util.ThreadPool; import org.mariotaku.menucomponent.widget.MenuBar; +import org.mariotaku.menucomponent.widget.MenuBar.MenuBarListener; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.R; import org.mariotaku.twidere.activity.support.TwidereSwipeBackActivity; @@ -60,7 +61,7 @@ import me.imid.swipebacklayout.lib.SwipeBackLayout.SwipeListener; public final class ImageViewerGLActivity extends TwidereSwipeBackActivity implements Constants, PhotoView.Listener, GLImageLoader.DownloadListener, LoaderManager.LoaderCallbacks, OnMenuVisibilityListener, - SwipeListener, OnMenuItemClickListener { + SwipeListener, MenuBarListener { private final GLView mRootPane = new GLView() { @Override @@ -340,7 +341,7 @@ public final class ImageViewerGLActivity extends TwidereSwipeBackActivity implem if (savedInstanceState == null) { loadImage(); } - mMenuBar.setOnMenuItemClickListener(this); + mMenuBar.setMenuBarListener(this); mMenuBar.inflate(R.menu.menu_image_viewer); mMenuBar.setIsBottomBar(true); mMenuBar.show(); @@ -531,6 +532,11 @@ public final class ImageViewerGLActivity extends TwidereSwipeBackActivity implem Utils.addIntentToMenu(this, subMenu, shareIntent); } + @Override + public void onPreShowMenu(Menu menu) { + + } + private static class MyHandler extends SynchronizedHandler { ImageViewerGLActivity activity; diff --git a/twidere/src/main/java/org/mariotaku/twidere/Constants.java b/twidere/src/main/java/org/mariotaku/twidere/Constants.java index 1c81101cc..00930b42d 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/Constants.java +++ b/twidere/src/main/java/org/mariotaku/twidere/Constants.java @@ -28,7 +28,7 @@ package org.mariotaku.twidere; public interface Constants extends TwidereConstants { public static final String DATABASES_NAME = "twidere.sqlite"; - public static final int DATABASES_VERSION = 66; + public static final int DATABASES_VERSION = 67; public static final String GOOGLE_MAPS_API_KEY_RELEASE = "0kjPwJOe_zwYjzGc9uYak7vhm_Sf3eob-2L3Xzw"; public static final String GOOGLE_MAPS_API_KEY_DEBUG = "0kjPwJOe_zwY9p6kT-kygu4mxwysyOOpfkaXqTA"; diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/FiltersActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/FiltersActivity.java index 970214a09..351c931a3 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/FiltersActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/FiltersActivity.java @@ -61,10 +61,10 @@ import org.mariotaku.twidere.fragment.support.BaseSupportDialogFragment; import org.mariotaku.twidere.menu.TwidereMenuInflater; import org.mariotaku.twidere.model.ParcelableUser; import org.mariotaku.twidere.provider.TweetStore.Filters; +import org.mariotaku.twidere.util.ContentValuesCreator; import org.mariotaku.twidere.util.ParseUtils; import org.mariotaku.twidere.util.ThemeUtils; -import static org.mariotaku.twidere.util.ContentValuesCreator.makeFilterdUserContentValues; import static org.mariotaku.twidere.util.Utils.getDefaultAccountId; public class FiltersActivity extends BaseSupportActivity implements TabListener, OnPageChangeListener { @@ -204,7 +204,7 @@ public class FiltersActivity extends BaseSupportActivity implements TabListener, if (resultCode != RESULT_OK || !(filter instanceof FilteredUsersFragment) || !data.hasExtra(EXTRA_USER)) return; final ParcelableUser user = data.getParcelableExtra(EXTRA_USER); - final ContentValues values = makeFilterdUserContentValues(user); + final ContentValues values = ContentValuesCreator.makeFilteredUserContentValues(user); final ContentResolver resolver = getContentResolver(); resolver.delete(Filters.Users.CONTENT_URI, Where.equals(Filters.Users.USER_ID, user.id).getSQL(), null); resolver.insert(Filters.Users.CONTENT_URI, values); diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/APIEditorActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/APIEditorActivity.java index b1ed131d9..5ef1ce1e1 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/APIEditorActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/APIEditorActivity.java @@ -53,7 +53,7 @@ public class APIEditorActivity extends BaseSupportDialogActivity implements Twit OnClickListener { private EditText mEditAPIUrlFormat; - private CheckBox mEditSameOAuthSigningUrl; + private CheckBox mEditSameOAuthSigningUrl, mEditNoVersionSuffix; private EditText mEditConsumerKey, mEditConsumerSecret; private RadioGroup mEditAuthType; private RadioButton mButtonOAuth, mButtonxAuth, mButtonBasic, mButtonTwipOMode; @@ -111,6 +111,7 @@ public class APIEditorActivity extends BaseSupportDialogActivity implements Twit mAdvancedAPIConfigLabel = (TextView) findViewById(R.id.advanced_api_config_label); mAdvancedAPIConfigView = findViewById(R.id.advanced_api_config); mEditSameOAuthSigningUrl = (CheckBox) findViewById(R.id.same_oauth_signing_url); + mEditNoVersionSuffix = (CheckBox) findViewById(R.id.no_version_suffix); mEditConsumerKey = (EditText) findViewById(R.id.consumer_key); mEditConsumerSecret = (EditText) findViewById(R.id.consumer_secret); mSaveButton = (Button) findViewById(R.id.save); @@ -122,11 +123,13 @@ public class APIEditorActivity extends BaseSupportDialogActivity implements Twit final String apiUrlFormat = parseString(mEditAPIUrlFormat.getText()); final int authType = getCheckedAuthType(mEditAuthType.getCheckedRadioButtonId()); final boolean sameOAuthSigningUrl = mEditSameOAuthSigningUrl.isChecked(); + final boolean noVersionSuffix = mEditNoVersionSuffix.isChecked(); final String consumerKey = parseString(mEditConsumerKey.getText()); final String consumerSecret = parseString(mEditConsumerSecret.getText()); outState.putString(Accounts.API_URL_FORMAT, apiUrlFormat); outState.putInt(Accounts.AUTH_TYPE, authType); outState.putBoolean(Accounts.SAME_OAUTH_SIGNING_URL, sameOAuthSigningUrl); + outState.putBoolean(Accounts.NO_VERSION_SUFFIX, noVersionSuffix); outState.putString(Accounts.CONSUMER_KEY, consumerKey); outState.putString(Accounts.CONSUMER_SECRET, consumerSecret); super.onSaveInstanceState(outState); @@ -136,12 +139,14 @@ public class APIEditorActivity extends BaseSupportDialogActivity implements Twit final String apiUrlFormat = parseString(mEditAPIUrlFormat.getText()); final int authType = getCheckedAuthType(mEditAuthType.getCheckedRadioButtonId()); final boolean sameOAuthSigningUrl = mEditSameOAuthSigningUrl.isChecked(); + final boolean noVersionSuffix = mEditNoVersionSuffix.isChecked(); final String consumerKey = parseString(mEditConsumerKey.getText()); final String consumerSecret = parseString(mEditConsumerSecret.getText()); final Intent intent = new Intent(); intent.putExtra(Accounts.API_URL_FORMAT, apiUrlFormat); intent.putExtra(Accounts.AUTH_TYPE, authType); intent.putExtra(Accounts.SAME_OAUTH_SIGNING_URL, sameOAuthSigningUrl); + intent.putExtra(Accounts.NO_VERSION_SUFFIX, noVersionSuffix); intent.putExtra(Accounts.CONSUMER_KEY, consumerKey); intent.putExtra(Accounts.CONSUMER_SECRET, consumerSecret); setResult(RESULT_OK, intent); @@ -155,13 +160,14 @@ public class APIEditorActivity extends BaseSupportDialogActivity implements Twit String apiUrlFormat; int authType; - boolean sameOAuthSigningUrl; + boolean sameOAuthSigningUrl, noVersionSuffix; String consumerKey, consumerSecret; final SharedPreferences pref = getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE); final String prefApiUrlFormat = getNonEmptyString(pref, KEY_API_URL_FORMAT, DEFAULT_REST_BASE_URL); final int prefAuthType = pref.getInt(KEY_AUTH_TYPE, Accounts.AUTH_TYPE_OAUTH); final boolean prefSameOAuthSigningUrl = pref.getBoolean(KEY_SAME_OAUTH_SIGNING_URL, false); + final boolean prefNoVersionSuffix = pref.getBoolean(KEY_NO_VERSION_SUFFIX, false); final String prefConsumerKey = getNonEmptyString(pref, KEY_CONSUMER_KEY, TWITTER_CONSUMER_KEY_2); final String prefConsumerSecret = getNonEmptyString(pref, KEY_CONSUMER_SECRET, TWITTER_CONSUMER_SECRET_2); if (savedInstanceState != null) { @@ -169,6 +175,8 @@ public class APIEditorActivity extends BaseSupportDialogActivity implements Twit authType = savedInstanceState.getInt(Accounts.AUTH_TYPE, prefAuthType); sameOAuthSigningUrl = savedInstanceState.getBoolean(Accounts.SAME_OAUTH_SIGNING_URL, prefSameOAuthSigningUrl); + noVersionSuffix = savedInstanceState.getBoolean(Accounts.NO_VERSION_SUFFIX, + prefNoVersionSuffix); consumerKey = trim(savedInstanceState.getString(Accounts.CONSUMER_KEY, prefConsumerKey)); consumerSecret = trim(savedInstanceState.getString(Accounts.CONSUMER_SECRET, prefConsumerSecret)); } else { @@ -177,6 +185,7 @@ public class APIEditorActivity extends BaseSupportDialogActivity implements Twit apiUrlFormat = trim(extras.getString(Accounts.API_URL_FORMAT, prefApiUrlFormat)); authType = extras.getInt(Accounts.AUTH_TYPE, prefAuthType); sameOAuthSigningUrl = extras.getBoolean(Accounts.SAME_OAUTH_SIGNING_URL, prefSameOAuthSigningUrl); + noVersionSuffix = extras.getBoolean(Accounts.NO_VERSION_SUFFIX, prefNoVersionSuffix); consumerKey = trim(extras.getString(Accounts.CONSUMER_KEY, prefConsumerKey)); consumerSecret = trim(extras.getString(Accounts.CONSUMER_SECRET, prefConsumerSecret)); } @@ -188,6 +197,7 @@ public class APIEditorActivity extends BaseSupportDialogActivity implements Twit mEditAPIUrlFormat.setText(apiUrlFormat); mEditSameOAuthSigningUrl.setChecked(sameOAuthSigningUrl); + mEditNoVersionSuffix.setChecked(noVersionSuffix); mEditConsumerKey.setText(consumerKey); mEditConsumerSecret.setText(consumerSecret); diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseSupportThemedActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseSupportThemedActivity.java index 07fc240db..c400475ea 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseSupportThemedActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseSupportThemedActivity.java @@ -21,9 +21,13 @@ package org.mariotaku.twidere.activity.support; import android.app.ActionBar; import android.content.res.Resources; +import android.graphics.Color; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.support.v4.app.NavUtils; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.style.ForegroundColorSpan; import android.view.Menu; import org.mariotaku.twidere.Constants; @@ -143,6 +147,20 @@ public abstract class BaseSupportThemedActivity extends FragmentActivity impleme super.onStart(); } + @Override + protected void onTitleChanged(CharSequence title, int color) { + final SpannableStringBuilder builder = new SpannableStringBuilder(title); + super.onTitleChanged(title, color); + final int themeResId = getCurrentThemeResourceId(); + final int themeColor = getThemeColor(), contrastColor = Utils.getContrastYIQ(themeColor, 192); + if (ThemeUtils.isColoredActionBar(themeResId)) { + builder.setSpan(new ForegroundColorSpan(contrastColor), 0, builder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } else { + final int titleColor = ThemeUtils.isLightActionBar(themeResId) ? Color.BLACK : Color.WHITE; + builder.setSpan(new ForegroundColorSpan(titleColor), 0, builder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + } + @Override protected void onResume() { super.onResume(); diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/ComposeActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/ComposeActivity.java index bbb7089c4..1e437bba9 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/ComposeActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/ComposeActivity.java @@ -43,6 +43,7 @@ import android.os.Bundle; import android.os.Environment; import android.os.Parcelable; import android.provider.MediaStore; +import android.support.annotation.NonNull; import android.support.v4.app.DialogFragment; import android.support.v4.util.LongSparseArray; import android.text.Editable; @@ -53,7 +54,6 @@ import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; -import android.view.MenuItem.OnMenuItemClickListener; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; @@ -78,6 +78,7 @@ import com.twitter.Extractor; import org.mariotaku.dynamicgridview.DraggableArrayAdapter; import org.mariotaku.menucomponent.widget.MenuBar; +import org.mariotaku.menucomponent.widget.MenuBar.MenuBarListener; import org.mariotaku.menucomponent.widget.PopupMenu; import org.mariotaku.twidere.R; import org.mariotaku.twidere.adapter.BaseArrayAdapter; @@ -148,7 +149,7 @@ import static org.mariotaku.twidere.util.Utils.showErrorMessage; import static org.mariotaku.twidere.util.Utils.showMenuItemToast; public class ComposeActivity extends BaseSupportDialogActivity implements TextWatcher, LocationListener, - OnMenuItemClickListener, OnClickListener, OnEditorActionListener, OnItemClickListener, OnItemLongClickListener, + MenuBarListener, OnClickListener, OnEditorActionListener, OnItemClickListener, OnItemLongClickListener, OnLongClickListener { private static final String FAKE_IMAGE_LINK = "https://www.example.com/fake_image.jpg"; @@ -595,8 +596,8 @@ public class ComposeActivity extends BaseSupportDialogActivity implements TextWa return; } mBottomMenuBar.setIsBottomBar(true); - mBottomMenuBar.setOnMenuItemClickListener(this); - mActionMenuBar.setOnMenuItemClickListener(this); + mBottomMenuBar.setMenuBarListener(this); + mActionMenuBar.setMenuBarListener(this); mEditText.setOnEditorActionListener(mPreferences.getBoolean(KEY_QUICK_SEND, false) ? this : null); mEditText.addTextChangedListener(this); mAccountSelectorAdapter = new AccountSelectorAdapter(this); @@ -1142,7 +1143,7 @@ public class ComposeActivity extends BaseSupportDialogActivity implements TextWa private void updateTextCount() { final StatusTextCountView textCountView = mBottomSendButton ? mBottomSendTextCountView : mSendTextCountView; if (textCountView != null && mEditText != null) { - final String textOrig = mEditText != null ? parseString(mEditText.getText()) : null; + final String textOrig = parseString(mEditText.getText()); final String text = hasMedia() && textOrig != null ? mImageUploaderUsed ? getImageUploadStatus(this, new String[]{FAKE_IMAGE_LINK}, textOrig) : textOrig + " " + FAKE_IMAGE_LINK : textOrig; final int validatedCount = text != null ? mValidator.getTweetLength(text) : 0; @@ -1150,6 +1151,11 @@ public class ComposeActivity extends BaseSupportDialogActivity implements TextWa } } + @Override + public void onPreShowMenu(Menu menu) { + + } + public static class RetweetProtectedStatusWarnFragment extends BaseSupportDialogFragment implements DialogInterface.OnClickListener { @@ -1167,6 +1173,7 @@ public class ComposeActivity extends BaseSupportDialogActivity implements TextWa } + @NonNull @Override public Dialog onCreateDialog(final Bundle savedInstanceState) { final Context wrapped = ThemeUtils.getDialogThemedContext(getActivity()); @@ -1204,6 +1211,7 @@ public class ComposeActivity extends BaseSupportDialogActivity implements TextWa } + @NonNull @Override public Dialog onCreateDialog(final Bundle savedInstanceState) { final Context wrapped = ThemeUtils.getDialogThemedContext(getActivity()); diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/HomeActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/HomeActivity.java index 79e333e3e..b2b9a6365 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/HomeActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/HomeActivity.java @@ -35,6 +35,7 @@ import android.database.ContentObserver; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Rect; +import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; @@ -228,9 +229,7 @@ public class HomeActivity extends BaseSupportActivity implements OnClickListener @Override public void onClick(final View v) { switch (v.getId()) { - case R.id.actions: - case R.id.actions_button: - case R.id.actions_button_bottom: { + case R.id.actions_button: { triggerActionsClick(); break; } @@ -248,7 +247,7 @@ public class HomeActivity extends BaseSupportActivity implements OnClickListener mSlidingMenu = (HomeSlidingMenu) findViewById(R.id.home_menu); mViewPager = (ExtendedViewPager) findViewById(R.id.main_pager); mEmptyTabHint = findViewById(R.id.empty_tab_hint); - mActionsButton = findViewById(R.id.actions_button_bottom); + mActionsButton = findViewById(R.id.actions_button); mTabsContainer = findViewById(R.id.tabs_container); mTabIndicator = (TabPagerIndicator) findViewById(R.id.main_tabs); mActionBarOverlay = findViewById(R.id.actionbar_overlay); @@ -297,12 +296,7 @@ public class HomeActivity extends BaseSupportActivity implements OnClickListener @Override public boolean onLongClick(final View v) { switch (v.getId()) { - case R.id.actions: case R.id.actions_button: { - showMenuItemToast(v, v.getContentDescription()); - return true; - } - case R.id.actions_button_bottom: { showMenuItemToast(v, v.getContentDescription(), true); return true; } @@ -574,7 +568,7 @@ public class HomeActivity extends BaseSupportActivity implements OnClickListener final int themeColor = getThemeColor(), contrastColor = Utils.getContrastYIQ(themeColor, 192); final int themeResId = getCurrentThemeResourceId(); if (ThemeUtils.isColoredActionBar(themeResId)) { - mTabIndicator.setBackgroundColor(themeColor); + ViewAccessor.setBackground(mTabIndicator, new ColorDrawable(themeColor)); mTabIndicator.setStripColor(contrastColor); mTabIndicator.setIconColor(contrastColor); } else { diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/LinkHandlerActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/LinkHandlerActivity.java index 602d28ccd..9344b9d43 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/LinkHandlerActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/LinkHandlerActivity.java @@ -120,6 +120,10 @@ public class LinkHandlerActivity extends BaseSupportActivity implements OnClickL requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setUiOptions(getWindow(), data); super.onCreate(savedInstanceState); + final ActionBar actionBar = getActionBar(); + if (actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled(true); + } setContentView(R.layout.layout_link_handler); setProgressBarIndeterminateVisibility(false); if (data == null || !showFragment(data)) { @@ -148,11 +152,6 @@ public class LinkHandlerActivity extends BaseSupportActivity implements OnClickL } } - @Override - protected void onTitleChanged(final CharSequence title, final int color) { - super.onTitleChanged(title, color); - } - private void setUiOptions(final Window window, final Uri data) { if (FlymeUtils.hasSmartBar()) { window.setUiOptions(ActivityInfo.UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW); diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/SignInActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/SignInActivity.java index fbd175205..6906b4b89 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/SignInActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/SignInActivity.java @@ -26,7 +26,6 @@ import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; -import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; @@ -35,7 +34,6 @@ import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.view.Menu; -import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; @@ -116,7 +114,7 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta private SharedPreferences mPreferences; private ContentResolver mResolver; private AbstractSignInTask mTask; - private boolean mSameOAuthSigningUrl; + private boolean mSameOAuthSigningUrl, mNoVersionSuffix; @Override public void afterTextChanged(final Editable s) { @@ -136,6 +134,7 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta mAPIUrlFormat = data.getStringExtra(Accounts.API_URL_FORMAT); mAuthType = data.getIntExtra(Accounts.AUTH_TYPE, Accounts.AUTH_TYPE_OAUTH); mSameOAuthSigningUrl = data.getBooleanExtra(Accounts.SAME_OAUTH_SIGNING_URL, false); + mNoVersionSuffix = data.getBooleanExtra(Accounts.NO_VERSION_SUFFIX, false); mConsumerKey = data.getStringExtra(Accounts.CONSUMER_KEY); mConsumerSecret = data.getStringExtra(Accounts.CONSUMER_SECRET); final boolean isTwipOMode = mAuthType == Accounts.AUTH_TYPE_TWIP_O_MODE; @@ -263,6 +262,7 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta intent.putExtra(Accounts.API_URL_FORMAT, mAPIUrlFormat); intent.putExtra(Accounts.AUTH_TYPE, mAuthType); intent.putExtra(Accounts.SAME_OAUTH_SIGNING_URL, mSameOAuthSigningUrl); + intent.putExtra(Accounts.NO_VERSION_SUFFIX, mNoVersionSuffix); intent.putExtra(Accounts.CONSUMER_KEY, mConsumerKey); intent.putExtra(Accounts.CONSUMER_SECRET, mConsumerSecret); startActivityForResult(intent, REQUEST_EDIT_API); @@ -305,6 +305,7 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta outState.putString(Accounts.API_URL_FORMAT, mAPIUrlFormat); outState.putInt(Accounts.AUTH_TYPE, mAuthType); outState.putBoolean(Accounts.SAME_OAUTH_SIGNING_URL, mSameOAuthSigningUrl); + outState.putBoolean(Accounts.NO_VERSION_SUFFIX, mNoVersionSuffix); outState.putString(Accounts.CONSUMER_KEY, mConsumerKey); outState.putString(Accounts.CONSUMER_SECRET, mConsumerSecret); outState.putString(Accounts.SCREEN_NAME, mUsername); @@ -368,7 +369,7 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta setDefaultAPI(); final Configuration conf = getConfiguration(); mTask = new SignInTask(this, conf, mUsername, mPassword, mAuthType, mUserColor, mAPIUrlFormat, - mSameOAuthSigningUrl); + mSameOAuthSigningUrl, mNoVersionSuffix); mTask.execute(); } @@ -384,7 +385,7 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta final String secret = intent.getStringExtra(EXTRA_REQUEST_TOKEN_SECRET); final String verifier = intent.getStringExtra(EXTRA_OAUTH_VERIFIER); mTask = new BrowserSignInTask(this, conf, token, secret, verifier, mUserColor, mAPIUrlFormat, - mSameOAuthSigningUrl); + mSameOAuthSigningUrl, mNoVersionSuffix); mTask.execute(); } @@ -397,9 +398,10 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta cb.setHttpClientFactory(new TwidereHttpClientFactory(mApplication)); setUserAgent(this, cb); if (!isEmpty(mAPIUrlFormat)) { - cb.setRestBaseURL(Utils.getApiUrl(mAPIUrlFormat, "api", "/1.1/")); + final String versionSuffix = mNoVersionSuffix ? null : "/1.1/"; + cb.setRestBaseURL(Utils.getApiUrl(mAPIUrlFormat, "api", versionSuffix)); cb.setOAuthBaseURL(Utils.getApiUrl(mAPIUrlFormat, "api", "/oauth/")); - cb.setUploadBaseURL(Utils.getApiUrl(mAPIUrlFormat, "upload", "/1.1/")); + cb.setUploadBaseURL(Utils.getApiUrl(mAPIUrlFormat, "upload", versionSuffix)); if (!mSameOAuthSigningUrl) { cb.setSigningRestBaseURL(DEFAULT_SIGNING_REST_BASE_URL); cb.setSigningOAuthBaseURL(DEFAULT_SIGNING_OAUTH_BASE_URL); @@ -437,6 +439,7 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta final String apiUrlFormat = getNonEmptyString(mPreferences, KEY_API_URL_FORMAT, null); final int authType = mPreferences.getInt(KEY_AUTH_TYPE, Accounts.AUTH_TYPE_OAUTH); final boolean sameOAuthSigningUrl = mPreferences.getBoolean(KEY_SAME_OAUTH_SIGNING_URL, false); + final boolean noVersionSuffix = mPreferences.getBoolean(KEY_NO_VERSION_SUFFIX, false); final String consumerKey = getNonEmptyString(mPreferences, KEY_CONSUMER_KEY, TWITTER_CONSUMER_KEY_2); final String consumerSecret = getNonEmptyString(mPreferences, KEY_CONSUMER_SECRET, TWITTER_CONSUMER_SECRET_2); if (isEmpty(mAPIUrlFormat) || defaultApiChanged) { @@ -448,6 +451,9 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta if (defaultApiChanged) { mSameOAuthSigningUrl = sameOAuthSigningUrl; } + if (defaultApiChanged) { + mNoVersionSuffix = noVersionSuffix; + } if (isEmpty(mConsumerKey) || defaultApiChanged) { mConsumerKey = consumerKey; } @@ -472,25 +478,27 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta } } - void onSignInResult(final SignInActivity.SigninResponse result) { + void onSignInResult(final SignInResponse result) { if (result != null) { if (result.succeed) { final ContentValues values; switch (result.auth_type) { case Accounts.AUTH_TYPE_BASIC: { values = makeAccountContentValuesBasic(result.conf, result.basic_username, - result.basic_password, result.user, result.color, result.api_url_format); + result.basic_password, result.user, result.color, + result.api_url_format, result.no_version_suffix); break; } case Accounts.AUTH_TYPE_TWIP_O_MODE: { values = makeAccountContentValuesTWIP(result.conf, result.user, result.color, - result.api_url_format); + result.api_url_format, result.no_version_suffix); break; } case Accounts.AUTH_TYPE_OAUTH: case Accounts.AUTH_TYPE_XAUTH: { - values = makeAccountContentValuesOAuth(result.conf, result.access_token, result.user, - result.auth_type, result.color, result.api_url_format, result.same_oauth_signing_url); + values = makeAccountContentValuesOAuth(result.conf, result.access_token, + result.user, result.auth_type, result.color, result.api_url_format, + result.same_oauth_signing_url, result.no_version_suffix); break; } default: { @@ -540,7 +548,7 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta mSetColorButton.setEnabled(false); } - public static abstract class AbstractSignInTask extends AsyncTask { + public static abstract class AbstractSignInTask extends AsyncTask { protected final Configuration conf; protected final SignInActivity callback; @@ -551,7 +559,7 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta } @Override - protected void onPostExecute(final SigninResponse result) { + protected void onPostExecute(final SignInResponse result) { if (callback != null) { callback.onSignInResult(result); } @@ -597,11 +605,11 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta private final Context context; private final String api_url_format; - private final boolean same_oauth_signing_url; + private final boolean same_oauth_signing_url, no_version_suffix; public BrowserSignInTask(final SignInActivity context, final Configuration conf, final String request_token, final String request_token_secret, final String oauth_verifier, final Integer user_color, - final String api_url_format, final boolean same_oauth_signing_url) { + final String api_url_format, final boolean same_oauth_signing_url, final boolean no_version_suffix) { super(context, conf); this.context = context; this.conf = conf; @@ -611,23 +619,24 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta this.user_color = user_color; this.api_url_format = api_url_format; this.same_oauth_signing_url = same_oauth_signing_url; + this.no_version_suffix = no_version_suffix; } @Override - protected SigninResponse doInBackground(final Void... params) { + protected SignInResponse doInBackground(final Void... params) { try { final Twitter twitter = new TwitterFactory(conf).getInstance(); final AccessToken access_token = twitter.getOAuthAccessToken(new RequestToken(conf, request_token, request_token_secret), oauth_verifier); final long userId = access_token.getUserId(); - if (userId <= 0) return new SigninResponse(false, false, null); + if (userId <= 0) return new SignInResponse(false, false, null); final User user = twitter.verifyCredentials(); - if (isUserLoggedIn(context, userId)) return new SigninResponse(true, false, null); + if (isUserLoggedIn(context, userId)) return new SignInResponse(true, false, null); final int color = user_color != null ? user_color : analyseUserProfileColor(user); - return new SigninResponse(conf, access_token, user, Accounts.AUTH_TYPE_OAUTH, color, api_url_format, - same_oauth_signing_url); + return new SignInResponse(conf, access_token, user, Accounts.AUTH_TYPE_OAUTH, color, + api_url_format, same_oauth_signing_url, no_version_suffix); } catch (final TwitterException e) { - return new SigninResponse(false, false, e); + return new SignInResponse(false, false, e); } } } @@ -655,11 +664,11 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta private final Context context; private final String api_url_format; - private final boolean same_oauth_signing_url; + private final boolean same_oauth_signing_url, no_version_suffix; public SignInTask(final SignInActivity context, final Configuration conf, final String username, final String password, final int auth_type, final Integer user_color, final String api_url_format, - final boolean same_oauth_signing_url) { + final boolean same_oauth_signing_url, final boolean no_version_suffix) { super(context, conf); this.context = context; this.conf = conf; @@ -669,10 +678,11 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta this.user_color = user_color; this.api_url_format = api_url_format; this.same_oauth_signing_url = same_oauth_signing_url; + this.no_version_suffix = no_version_suffix; } @Override - protected SigninResponse doInBackground(final Void... params) { + protected SignInResponse doInBackground(final Void... params) { try { switch (auth_type) { case Accounts.AUTH_TYPE_OAUTH: @@ -687,67 +697,73 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta return authOAuth(); } catch (final TwitterException e) { e.printStackTrace(); - return new SigninResponse(false, false, e); + return new SignInResponse(false, false, e); } catch (final AuthenticationException e) { e.printStackTrace(); - return new SigninResponse(false, false, e); + return new SignInResponse(false, false, e); } } - private SigninResponse authBasic() throws TwitterException { + private SignInResponse authBasic() throws TwitterException { final Twitter twitter = new TwitterFactory(conf).getInstance(new BasicAuthorization(username, password)); final User user = twitter.verifyCredentials(); final long user_id = user.getId(); - if (user_id <= 0) return new SigninResponse(false, false, null); - if (isUserLoggedIn(context, user_id)) return new SigninResponse(true, false, null); + if (user_id <= 0) return new SignInResponse(false, false, null); + if (isUserLoggedIn(context, user_id)) return new SignInResponse(true, false, null); final int color = user_color != null ? user_color : analyseUserProfileColor(user); - return new SigninResponse(conf, username, password, user, color, api_url_format); + return new SignInResponse(conf, username, password, user, color, api_url_format, + no_version_suffix); } - private SigninResponse authOAuth() throws AuthenticationException, TwitterException { + private SignInResponse authOAuth() throws AuthenticationException, TwitterException { final Twitter twitter = new TwitterFactory(conf).getInstance(); final OAuthPasswordAuthenticator authenticator = new OAuthPasswordAuthenticator(twitter); final AccessToken access_token = authenticator.getOAuthAccessToken(username, password); final long user_id = access_token.getUserId(); - if (user_id <= 0) return new SigninResponse(false, false, null); + if (user_id <= 0) return new SignInResponse(false, false, null); final User user = twitter.verifyCredentials(); - if (isUserLoggedIn(context, user_id)) return new SigninResponse(true, false, null); + if (isUserLoggedIn(context, user_id)) return new SignInResponse(true, false, null); final int color = user_color != null ? user_color : analyseUserProfileColor(user); - return new SigninResponse(conf, access_token, user, Accounts.AUTH_TYPE_OAUTH, color, api_url_format, - same_oauth_signing_url); + return new SignInResponse(conf, access_token, user, Accounts.AUTH_TYPE_OAUTH, color, + api_url_format, same_oauth_signing_url, no_version_suffix); } - private SigninResponse authTwipOMode() throws TwitterException { + private SignInResponse authTwipOMode() throws TwitterException { final Twitter twitter = new TwitterFactory(conf).getInstance(new TwipOModeAuthorization()); final User user = twitter.verifyCredentials(); final long user_id = user.getId(); - if (user_id <= 0) return new SigninResponse(false, false, null); - if (isUserLoggedIn(context, user_id)) return new SigninResponse(true, false, null); + if (user_id <= 0) return new SignInResponse(false, false, null); + if (isUserLoggedIn(context, user_id)) return new SignInResponse(true, false, null); final int color = user_color != null ? user_color : analyseUserProfileColor(user); - return new SigninResponse(conf, user, color, api_url_format); + return new SignInResponse(conf, user, color, api_url_format, no_version_suffix); } - private SigninResponse authxAuth() throws TwitterException { + private SignInResponse authxAuth() throws TwitterException { final Twitter twitter = new TwitterFactory(conf).getInstance(); final AccessToken access_token = twitter.getOAuthAccessToken(username, password); final User user = twitter.verifyCredentials(); final long user_id = user.getId(); - if (user_id <= 0) return new SigninResponse(false, false, null); - if (isUserLoggedIn(context, user_id)) return new SigninResponse(true, false, null); + if (user_id <= 0) return new SignInResponse(false, false, null); + if (isUserLoggedIn(context, user_id)) return new SignInResponse(true, false, null); final int color = user_color != null ? user_color : analyseUserProfileColor(user); - return new SigninResponse(conf, access_token, user, Accounts.AUTH_TYPE_XAUTH, color, api_url_format, - same_oauth_signing_url); + return new SignInResponse(conf, access_token, user, Accounts.AUTH_TYPE_XAUTH, color, + api_url_format, same_oauth_signing_url, no_version_suffix); } } + @Override + public int getThemeResourceId() { + return ThemeUtils.getSettingsThemeResource(this); + } + static interface SigninCallback { - void onSigninResult(SigninResponse response); + void onSigninResult(SignInResponse response); void onSigninStart(); } - static class SigninResponse { + static class SignInResponse { public final boolean already_logged_in, succeed; public final Exception exception; @@ -757,16 +773,16 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta public final User user; public final int auth_type, color; public final String api_url_format; - public final boolean same_oauth_signing_url; + public final boolean same_oauth_signing_url, no_version_suffix; - public SigninResponse(final boolean already_logged_in, final boolean succeed, final Exception exception) { - this(already_logged_in, succeed, exception, null, null, null, null, null, 0, 0, null, false); + public SignInResponse(final boolean already_logged_in, final boolean succeed, final Exception exception) { + this(already_logged_in, succeed, exception, null, null, null, null, null, 0, 0, null, false, false); } - public SigninResponse(final boolean already_logged_in, final boolean succeed, final Exception exception, + public SignInResponse(final boolean already_logged_in, final boolean succeed, final Exception exception, final Configuration conf, final String basic_username, final String basic_password, final AccessToken access_token, final User user, final int auth_type, final int color, - final String api_url_format, final boolean same_oauth_signing_url) { + final String api_url_format, final boolean same_oauth_signing_url, final boolean no_version_suffix) { this.already_logged_in = already_logged_in; this.succeed = succeed; this.exception = exception; @@ -779,23 +795,27 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta this.color = color; this.api_url_format = api_url_format; this.same_oauth_signing_url = same_oauth_signing_url; + this.no_version_suffix = no_version_suffix; } - public SigninResponse(final Configuration conf, final AccessToken access_token, final User user, - final int auth_type, final int color, final String api_url_format, final boolean same_oauth_signing_url) { + public SignInResponse(final Configuration conf, final AccessToken access_token, final User user, + final int auth_type, final int color, final String api_url_format, + final boolean same_oauth_signing_url, final boolean no_version_suffix) { this(false, true, null, conf, null, null, access_token, user, auth_type, color, api_url_format, - same_oauth_signing_url); + same_oauth_signing_url, no_version_suffix); } - public SigninResponse(final Configuration conf, final String basic_username, final String basic_password, - final User user, final int color, final String api_url_format) { + public SignInResponse(final Configuration conf, final String basic_username, final String basic_password, + final User user, final int color, final String api_url_format, + final boolean no_version_suffix) { this(false, true, null, conf, basic_username, basic_password, null, user, Accounts.AUTH_TYPE_BASIC, color, - api_url_format, false); + api_url_format, false, no_version_suffix); } - public SigninResponse(final Configuration conf, final User user, final int color, final String api_url_format) { + public SignInResponse(final Configuration conf, final User user, final int color, + final String api_url_format, final boolean no_version_suffix) { this(false, true, null, conf, null, null, null, user, Accounts.AUTH_TYPE_TWIP_O_MODE, color, - api_url_format, false); + api_url_format, false, no_version_suffix); } } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/constant/SharedPreferenceConstants.java b/twidere/src/main/java/org/mariotaku/twidere/constant/SharedPreferenceConstants.java index 3836c4866..ccff32c4e 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/constant/SharedPreferenceConstants.java +++ b/twidere/src/main/java/org/mariotaku/twidere/constant/SharedPreferenceConstants.java @@ -248,6 +248,8 @@ public interface SharedPreferenceConstants { public static final String KEY_API_URL_FORMAT = "api_url_format"; @Preference(type = BOOLEAN, hasDefault = true, defaultBoolean = false) public static final String KEY_SAME_OAUTH_SIGNING_URL = "same_oauth_signing_url"; + @Preference(type = BOOLEAN, hasDefault = true, defaultBoolean = false) + public static final String KEY_NO_VERSION_SUFFIX = "no_version_suffix"; @Preference(type = INT, hasDefault = true, defaultInt = Accounts.AUTH_TYPE_OAUTH) public static final String KEY_AUTH_TYPE = "auth_type"; @Preference(type = STRING, hasDefault = true, defaultString = TwidereConstants.TWITTER_CONSUMER_KEY_2) diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AddStatusFilterDialogFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AddStatusFilterDialogFragment.java index 8ae4c7916..2eb9d5dff 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AddStatusFilterDialogFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AddStatusFilterDialogFragment.java @@ -19,7 +19,7 @@ package org.mariotaku.twidere.fragment.support; -import static org.mariotaku.twidere.util.ContentValuesCreator.makeFilterdUserContentValues; +import static org.mariotaku.twidere.util.ContentValuesCreator.makeFilteredUserContentValues; import static org.mariotaku.twidere.util.Utils.getDisplayName; import static org.mariotaku.twidere.util.content.ContentResolverUtils.bulkDelete; import static org.mariotaku.twidere.util.content.ContentResolverUtils.bulkInsert; @@ -41,6 +41,7 @@ import org.mariotaku.twidere.R; import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.model.ParcelableUserMention; import org.mariotaku.twidere.provider.TweetStore.Filters; +import org.mariotaku.twidere.util.ContentValuesCreator; import org.mariotaku.twidere.util.HtmlEscapeHelper; import org.mariotaku.twidere.util.ParseUtils; import org.mariotaku.twidere.util.ThemeUtils; @@ -71,11 +72,11 @@ public class AddStatusFilterDialogFragment extends BaseSupportDialogFragment imp if (value instanceof ParcelableUserMention) { final ParcelableUserMention mention = (ParcelableUserMention) value; user_ids.add(mention.id); - user_values.add(makeFilterdUserContentValues(mention)); + user_values.add(makeFilteredUserContentValues(mention)); } else if (value instanceof ParcelableStatus) { final ParcelableStatus status = (ParcelableStatus) value; user_ids.add(status.user_id); - user_values.add(makeFilterdUserContentValues(status)); + user_values.add(ContentValuesCreator.makeFilteredUserContentValues(status)); } else if (info.type == FilterItemInfo.FILTER_TYPE_KEYWORD) { if (value != null) { final String keyword = ParseUtils.parseString(value); diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusFragment.java index 29a13d2f7..93a644d51 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusFragment.java @@ -65,7 +65,6 @@ import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView; -import org.mariotaku.menucomponent.widget.MenuBar; import org.mariotaku.refreshnow.widget.RefreshMode; import org.mariotaku.twidere.R; import org.mariotaku.twidere.activity.support.AccountSelectorActivity; @@ -98,6 +97,7 @@ import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.view.ColorLabelRelativeLayout; import org.mariotaku.twidere.view.ExtendedFrameLayout; import org.mariotaku.twidere.view.StatusTextView; +import org.mariotaku.twidere.view.TwidereMenuBar; import java.io.IOException; import java.util.ArrayList; @@ -156,7 +156,7 @@ public class StatusFragment extends ParcelableStatusesListFragment implements On private boolean mFollowInfoDisplayed, mLocationInfoDisplayed; private boolean mStatusLoaderInitialized, mLocationLoaderInitialized; private boolean mFollowInfoLoaderInitialized; - ; + private boolean mShouldScroll; private SharedPreferences mPreferences; private AsyncTwitterWrapper mTwitterWrapper; @@ -171,7 +171,7 @@ public class StatusFragment extends ParcelableStatusesListFragment implements On private Button mRetryButton; private View mMainContent, mFollowIndicator, mImagePreviewContainer, mLocationContainer, mLocationBackgroundView; private ColorLabelRelativeLayout mProfileView; - private MenuBar mMenuBar; + private TwidereMenuBar mMenuBar; private ProgressBar mDetailsLoadProgress, mFollowInfoProgress; private LinearLayout mImagePreviewGrid; private View mHeaderView; @@ -577,7 +577,7 @@ public class StatusFragment extends ParcelableStatusesListFragment implements On final View view = inflater.inflate(R.layout.fragment_details_page, null, false); mMainContent = view.findViewById(R.id.content); mDetailsLoadProgress = (ProgressBar) view.findViewById(R.id.details_load_progress); - mMenuBar = (MenuBar) view.findViewById(R.id.menu_bar); + mMenuBar = (TwidereMenuBar) view.findViewById(R.id.menu_bar); mDetailsContainer = (ExtendedFrameLayout) view.findViewById(R.id.details_container); mDetailsContainer.addView(super.onCreateView(inflater, container, savedInstanceState)); mHeaderView = inflater.inflate(R.layout.header_status, null, false); diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListDetailsFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListDetailsFragment.java index 1fbf9afd0..8400ae5a1 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListDetailsFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListDetailsFragment.java @@ -19,18 +19,6 @@ package org.mariotaku.twidere.fragment.support; -import static android.text.TextUtils.isEmpty; -import static org.mariotaku.twidere.util.Utils.addIntentToMenu; -import static org.mariotaku.twidere.util.Utils.getAccountColor; -import static org.mariotaku.twidere.util.Utils.getDisplayName; -import static org.mariotaku.twidere.util.Utils.getLocalizedNumber; -import static org.mariotaku.twidere.util.Utils.getTwitterInstance; -import static org.mariotaku.twidere.util.Utils.openUserListMembers; -import static org.mariotaku.twidere.util.Utils.openUserListSubscribers; -import static org.mariotaku.twidere.util.Utils.openUserListTimeline; -import static org.mariotaku.twidere.util.Utils.openUserProfile; -import static org.mariotaku.twidere.util.Utils.setMenuItemAvailability; - import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; @@ -67,6 +55,7 @@ import android.widget.ListView; import android.widget.TextView; import org.mariotaku.menucomponent.widget.MenuBar; +import org.mariotaku.menucomponent.widget.MenuBar.MenuBarListener; import org.mariotaku.twidere.R; import org.mariotaku.twidere.activity.support.UserListSelectorActivity; import org.mariotaku.twidere.adapter.ListActionAdapter; @@ -82,533 +71,547 @@ import org.mariotaku.twidere.util.ParseUtils; import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.TwidereLinkify; import org.mariotaku.twidere.view.ColorLabelRelativeLayout; +import org.mariotaku.twidere.view.TwidereMenuBar; + +import java.util.Locale; import twitter4j.Twitter; import twitter4j.TwitterException; import twitter4j.UserList; -import java.util.Locale; +import static android.text.TextUtils.isEmpty; +import static org.mariotaku.twidere.util.Utils.addIntentToMenu; +import static org.mariotaku.twidere.util.Utils.getAccountColor; +import static org.mariotaku.twidere.util.Utils.getDisplayName; +import static org.mariotaku.twidere.util.Utils.getLocalizedNumber; +import static org.mariotaku.twidere.util.Utils.getTwitterInstance; +import static org.mariotaku.twidere.util.Utils.openUserListMembers; +import static org.mariotaku.twidere.util.Utils.openUserListSubscribers; +import static org.mariotaku.twidere.util.Utils.openUserListTimeline; +import static org.mariotaku.twidere.util.Utils.openUserProfile; +import static org.mariotaku.twidere.util.Utils.setMenuItemAvailability; public class UserListDetailsFragment extends BaseSupportListFragment implements OnClickListener, OnItemClickListener, - OnItemLongClickListener, OnMenuItemClickListener, LoaderCallbacks>, - Panes.Right { + OnItemLongClickListener, OnMenuItemClickListener, LoaderCallbacks>, + Panes.Right { - private ImageLoaderWrapper mProfileImageLoader; - private AsyncTwitterWrapper mTwitterWrapper; + private ImageLoaderWrapper mProfileImageLoader; + private AsyncTwitterWrapper mTwitterWrapper; - private ImageView mProfileImageView; - private TextView mListNameView, mCreatedByView, mDescriptionView, mErrorMessageView; - private View mListContainer, mErrorRetryContainer; - private ColorLabelRelativeLayout mProfileContainer; - private View mDescriptionContainer; - private Button mRetryButton; - private ListView mListView; - private View mHeaderView; - private MenuBar mMenuBar; + private ImageView mProfileImageView; + private TextView mListNameView, mCreatedByView, mDescriptionView, mErrorMessageView; + private View mListContainer, mErrorRetryContainer; + private ColorLabelRelativeLayout mProfileContainer; + private View mDescriptionContainer; + private Button mRetryButton; + private ListView mListView; + private View mHeaderView; + private TwidereMenuBar mMenuBar; - private ListActionAdapter mAdapter; + private ListActionAdapter mAdapter; - private ParcelableUserList mUserList; - private Locale mLocale; + private ParcelableUserList mUserList; + private Locale mLocale; - private boolean mUserListLoaderInitialized; + private boolean mUserListLoaderInitialized; - private final BroadcastReceiver mStatusReceiver = new BroadcastReceiver() { + private final BroadcastReceiver mStatusReceiver = new BroadcastReceiver() { - @Override - public void onReceive(final Context context, final Intent intent) { - if (getActivity() == null || !isAdded() || isDetached()) return; - final String action = intent.getAction(); - final ParcelableUserList user_list = intent.getParcelableExtra(EXTRA_USER_LIST); - if (user_list == null || mUserList == null || !intent.getBooleanExtra(EXTRA_SUCCEED, false)) return; - if (BROADCAST_USER_LIST_DETAILS_UPDATED.equals(action)) { - if (user_list.id == mUserList.id) { - getUserListInfo(true); - } - } else if (BROADCAST_USER_LIST_SUBSCRIBED.equals(action) || BROADCAST_USER_LIST_UNSUBSCRIBED.equals(action)) { - if (user_list.id == mUserList.id) { - getUserListInfo(true); - } - } - } - }; + @Override + public void onReceive(final Context context, final Intent intent) { + if (getActivity() == null || !isAdded() || isDetached()) return; + final String action = intent.getAction(); + final ParcelableUserList user_list = intent.getParcelableExtra(EXTRA_USER_LIST); + if (user_list == null || mUserList == null || !intent.getBooleanExtra(EXTRA_SUCCEED, false)) + return; + if (BROADCAST_USER_LIST_DETAILS_UPDATED.equals(action)) { + if (user_list.id == mUserList.id) { + getUserListInfo(true); + } + } else if (BROADCAST_USER_LIST_SUBSCRIBED.equals(action) || BROADCAST_USER_LIST_UNSUBSCRIBED.equals(action)) { + if (user_list.id == mUserList.id) { + getUserListInfo(true); + } + } + } + }; - public void displayUserList(final ParcelableUserList userList) { - if (userList == null || getActivity() == null) return; - getLoaderManager().destroyLoader(0); - final boolean is_myself = userList.account_id == userList.user_id; - mErrorRetryContainer.setVisibility(View.GONE); - mUserList = userList; - mProfileContainer.drawEnd(getAccountColor(getActivity(), userList.account_id)); - mListNameView.setText(userList.name); - final String display_name = getDisplayName(getActivity(), userList.user_id, userList.user_name, - userList.user_screen_name, false); - mCreatedByView.setText(getString(R.string.created_by, display_name)); - final String description = userList.description; - mDescriptionContainer.setVisibility(is_myself || !isEmpty(description) ? View.VISIBLE : View.GONE); - mDescriptionView.setText(description); - final TwidereLinkify linkify = new TwidereLinkify( - new OnLinkClickHandler(getActivity(), getMultiSelectManager())); - linkify.applyAllLinks(mDescriptionView, userList.account_id, false); - mDescriptionView.setMovementMethod(LinkMovementMethod.getInstance()); - mProfileImageLoader.displayProfileImage(mProfileImageView, userList.user_profile_image_url); - mAdapter.notifyDataSetChanged(); - setMenu(mMenuBar.getMenu()); - mMenuBar.show(); - invalidateOptionsMenu(); - } + public void displayUserList(final ParcelableUserList userList) { + if (userList == null || getActivity() == null) return; + getLoaderManager().destroyLoader(0); + final boolean is_myself = userList.account_id == userList.user_id; + mErrorRetryContainer.setVisibility(View.GONE); + mUserList = userList; + mProfileContainer.drawEnd(getAccountColor(getActivity(), userList.account_id)); + mListNameView.setText(userList.name); + final String display_name = getDisplayName(getActivity(), userList.user_id, userList.user_name, + userList.user_screen_name, false); + mCreatedByView.setText(getString(R.string.created_by, display_name)); + final String description = userList.description; + mDescriptionContainer.setVisibility(is_myself || !isEmpty(description) ? View.VISIBLE : View.GONE); + mDescriptionView.setText(description); + final TwidereLinkify linkify = new TwidereLinkify( + new OnLinkClickHandler(getActivity(), getMultiSelectManager())); + linkify.applyAllLinks(mDescriptionView, userList.account_id, false); + mDescriptionView.setMovementMethod(LinkMovementMethod.getInstance()); + mProfileImageLoader.displayProfileImage(mProfileImageView, userList.user_profile_image_url); + mAdapter.notifyDataSetChanged(); + setMenu(mMenuBar.getMenu()); + mMenuBar.show(); + invalidateOptionsMenu(); + } - public void getUserListInfo(final boolean omit_intent_extra) { - final LoaderManager lm = getLoaderManager(); - lm.destroyLoader(0); - final Bundle args = new Bundle(getArguments()); - args.putBoolean(EXTRA_OMIT_INTENT_EXTRA, omit_intent_extra); - if (!mUserListLoaderInitialized) { - lm.initLoader(0, args, this); - mUserListLoaderInitialized = true; - } else { - lm.restartLoader(0, args, this); - } - } + public void getUserListInfo(final boolean omit_intent_extra) { + final LoaderManager lm = getLoaderManager(); + lm.destroyLoader(0); + final Bundle args = new Bundle(getArguments()); + args.putBoolean(EXTRA_OMIT_INTENT_EXTRA, omit_intent_extra); + if (!mUserListLoaderInitialized) { + lm.initLoader(0, args, this); + mUserListLoaderInitialized = true; + } else { + lm.restartLoader(0, args, this); + } + } - @Override - public void onActivityCreated(final Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - setHasOptionsMenu(true); - mTwitterWrapper = getApplication().getTwitterWrapper(); - mLocale = getResources().getConfiguration().locale; - mProfileImageLoader = getApplication().getImageLoaderWrapper(); - mAdapter = new ListActionAdapter(getActivity()); - mAdapter.add(new ListTimelineAction(1)); - mAdapter.add(new ListMembersAction(2)); - mAdapter.add(new ListSubscribersAction(3)); - mProfileImageView.setOnClickListener(this); - mProfileContainer.setOnClickListener(this); - mRetryButton.setOnClickListener(this); - setListAdapter(null); - mListView = getListView(); - mListView.addHeaderView(mHeaderView, null, false); - mListView.setOnItemClickListener(this); - mListView.setOnItemLongClickListener(this); - setListAdapter(mAdapter); - getUserListInfo(false); + @Override + public void onActivityCreated(final Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + setHasOptionsMenu(true); + mTwitterWrapper = getApplication().getTwitterWrapper(); + mLocale = getResources().getConfiguration().locale; + mProfileImageLoader = getApplication().getImageLoaderWrapper(); + mAdapter = new ListActionAdapter(getActivity()); + mAdapter.add(new ListTimelineAction(1)); + mAdapter.add(new ListMembersAction(2)); + mAdapter.add(new ListSubscribersAction(3)); + mProfileImageView.setOnClickListener(this); + mProfileContainer.setOnClickListener(this); + mRetryButton.setOnClickListener(this); + setListAdapter(null); + mListView = getListView(); + mListView.addHeaderView(mHeaderView, null, false); + mListView.setOnItemClickListener(this); + mListView.setOnItemLongClickListener(this); + setListAdapter(mAdapter); + getUserListInfo(false); - mMenuBar.inflate(R.menu.menu_user_list); - mMenuBar.setIsBottomBar(true); - mMenuBar.setOnMenuItemClickListener(this); - setMenu(mMenuBar.getMenu()); - mMenuBar.show(); - } + mMenuBar.inflate(R.menu.menu_user_list); + mMenuBar.setIsBottomBar(true); + mMenuBar.setOnMenuItemClickListener(this); + setMenu(mMenuBar.getMenu()); + mMenuBar.show(); + } - @Override - public void onActivityResult(final int requestCode, final int resultCode, final Intent data) { - switch (requestCode) { - case REQUEST_SELECT_USER: { - if (resultCode != Activity.RESULT_OK || !data.hasExtra(EXTRA_USER) || mTwitterWrapper == null - || mUserList == null) return; - final ParcelableUser user = data.getParcelableExtra(EXTRA_USER); - mTwitterWrapper.addUserListMembersAsync(mUserList.account_id, mUserList.id, user); - return; - } - } - super.onActivityResult(requestCode, resultCode, data); - } + @Override + public void onActivityResult(final int requestCode, final int resultCode, final Intent data) { + switch (requestCode) { + case REQUEST_SELECT_USER: { + if (resultCode != Activity.RESULT_OK || !data.hasExtra(EXTRA_USER) || mTwitterWrapper == null + || mUserList == null) return; + final ParcelableUser user = data.getParcelableExtra(EXTRA_USER); + mTwitterWrapper.addUserListMembersAsync(mUserList.account_id, mUserList.id, user); + return; + } + } + super.onActivityResult(requestCode, resultCode, data); + } - @Override - public void onClick(final View view) { - switch (view.getId()) { - case R.id.retry: { - getUserListInfo(true); - break; - } - case R.id.profile_image: { - if (mUserList == null) return; - openUserProfile(getActivity(), mUserList.account_id, mUserList.user_id, mUserList.user_screen_name); - break; - } - } + @Override + public void onClick(final View view) { + switch (view.getId()) { + case R.id.retry: { + getUserListInfo(true); + break; + } + case R.id.profile_image: { + if (mUserList == null) return; + openUserProfile(getActivity(), mUserList.account_id, mUserList.user_id, mUserList.user_screen_name); + break; + } + } - } + } - @Override - public Loader> onCreateLoader(final int id, final Bundle args) { - mListContainer.setVisibility(View.VISIBLE); - mErrorMessageView.setText(null); - mErrorMessageView.setVisibility(View.GONE); - mErrorRetryContainer.setVisibility(View.GONE); - setListShown(false); - setProgressBarIndeterminateVisibility(true); - final long accountId = args != null ? args.getLong(EXTRA_ACCOUNT_ID, -1) : -1; - final long userId = args != null ? args.getLong(EXTRA_USER_ID, -1) : -1; - final int listId = args != null ? args.getInt(EXTRA_LIST_ID, -1) : -1; - final String listName = args != null ? args.getString(EXTRA_LIST_NAME) : null; - final String screenName = args != null ? args.getString(EXTRA_SCREEN_NAME) : null; - final boolean omitIntentExtra = args != null ? args.getBoolean(EXTRA_OMIT_INTENT_EXTRA, true) : true; - return new ParcelableUserListLoader(getActivity(), omitIntentExtra, getArguments(), accountId, listId, - listName, userId, screenName); - } + @Override + public Loader> onCreateLoader(final int id, final Bundle args) { + mListContainer.setVisibility(View.VISIBLE); + mErrorMessageView.setText(null); + mErrorMessageView.setVisibility(View.GONE); + mErrorRetryContainer.setVisibility(View.GONE); + setListShown(false); + setProgressBarIndeterminateVisibility(true); + final long accountId = args != null ? args.getLong(EXTRA_ACCOUNT_ID, -1) : -1; + final long userId = args != null ? args.getLong(EXTRA_USER_ID, -1) : -1; + final int listId = args != null ? args.getInt(EXTRA_LIST_ID, -1) : -1; + final String listName = args != null ? args.getString(EXTRA_LIST_NAME) : null; + final String screenName = args != null ? args.getString(EXTRA_SCREEN_NAME) : null; + final boolean omitIntentExtra = args != null ? args.getBoolean(EXTRA_OMIT_INTENT_EXTRA, true) : true; + return new ParcelableUserListLoader(getActivity(), omitIntentExtra, getArguments(), accountId, listId, + listName, userId, screenName); + } - @Override - public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { - mHeaderView = inflater.inflate(R.layout.header_user_list_details, null); - mProfileContainer = (ColorLabelRelativeLayout) mHeaderView.findViewById(R.id.profile); - mListNameView = (TextView) mHeaderView.findViewById(R.id.list_name); - mCreatedByView = (TextView) mHeaderView.findViewById(R.id.created_by); - mDescriptionView = (TextView) mHeaderView.findViewById(R.id.description); - mProfileImageView = (ImageView) mHeaderView.findViewById(R.id.profile_image); - mDescriptionContainer = mHeaderView.findViewById(R.id.description_container); - mListContainer = super.onCreateView(inflater, container, savedInstanceState); - final View containerView = inflater.inflate(R.layout.fragment_details_page, null); - ((FrameLayout) containerView.findViewById(R.id.details_container)).addView(mListContainer); - mErrorRetryContainer = containerView.findViewById(R.id.error_retry_container); - mRetryButton = (Button) containerView.findViewById(R.id.retry); - mErrorMessageView = (TextView) containerView.findViewById(R.id.error_message); - mMenuBar = (MenuBar) containerView.findViewById(R.id.menu_bar); - final View cardView = mHeaderView.findViewById(R.id.card); - ThemeUtils.applyThemeAlphaToDrawable(cardView.getContext(), cardView.getBackground()); - return containerView; - } + @Override + public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { + mHeaderView = inflater.inflate(R.layout.header_user_list_details, null); + mProfileContainer = (ColorLabelRelativeLayout) mHeaderView.findViewById(R.id.profile); + mListNameView = (TextView) mHeaderView.findViewById(R.id.list_name); + mCreatedByView = (TextView) mHeaderView.findViewById(R.id.created_by); + mDescriptionView = (TextView) mHeaderView.findViewById(R.id.description); + mProfileImageView = (ImageView) mHeaderView.findViewById(R.id.profile_image); + mDescriptionContainer = mHeaderView.findViewById(R.id.description_container); + mListContainer = super.onCreateView(inflater, container, savedInstanceState); + final View containerView = inflater.inflate(R.layout.fragment_details_page, null); + ((FrameLayout) containerView.findViewById(R.id.details_container)).addView(mListContainer); + mErrorRetryContainer = containerView.findViewById(R.id.error_retry_container); + mRetryButton = (Button) containerView.findViewById(R.id.retry); + mErrorMessageView = (TextView) containerView.findViewById(R.id.error_message); + mMenuBar = (TwidereMenuBar) containerView.findViewById(R.id.menu_bar); + final View cardView = mHeaderView.findViewById(R.id.card); + ThemeUtils.applyThemeAlphaToDrawable(cardView.getContext(), cardView.getBackground()); + return containerView; + } - @Override - public void onDestroyView() { - mUserList = null; - getLoaderManager().destroyLoader(0); - super.onDestroyView(); - } + @Override + public void onDestroyView() { + mUserList = null; + getLoaderManager().destroyLoader(0); + super.onDestroyView(); + } - @Override - public void onItemClick(final AdapterView adapter, final View view, final int position, final long id) { - final ListAction action = mAdapter.findItem(id); - if (action != null) { - action.onClick(); - } - } + @Override + public void onItemClick(final AdapterView adapter, final View view, final int position, final long id) { + final ListAction action = mAdapter.findItem(id); + if (action != null) { + action.onClick(); + } + } - @Override - public boolean onItemLongClick(final AdapterView adapter, final View view, final int position, final long id) { - final ListAction action = mAdapter.findItem(id); - if (action != null) return action.onLongClick(); - return false; - } + @Override + public boolean onItemLongClick(final AdapterView adapter, final View view, final int position, final long id) { + final ListAction action = mAdapter.findItem(id); + if (action != null) return action.onLongClick(); + return false; + } - @Override - public void onLoaderReset(final Loader> loader) { + @Override + public void onLoaderReset(final Loader> loader) { - } + } - @Override - public void onLoadFinished(final Loader> loader, - final SingleResponse data) { - if (data == null) return; - if (getActivity() == null) return; - if (data.getData() != null) { - final ParcelableUserList list = data.getData(); - setListShown(true); - displayUserList(list); - mErrorRetryContainer.setVisibility(View.GONE); - } else { - if (data.hasException()) { - mErrorMessageView.setText(data.getException().getMessage()); - mErrorMessageView.setVisibility(View.VISIBLE); - } - mListContainer.setVisibility(View.GONE); - mErrorRetryContainer.setVisibility(View.VISIBLE); - } - setProgressBarIndeterminateVisibility(false); - } + @Override + public void onLoadFinished(final Loader> loader, + final SingleResponse data) { + if (data == null) return; + if (getActivity() == null) return; + if (data.getData() != null) { + final ParcelableUserList list = data.getData(); + setListShown(true); + displayUserList(list); + mErrorRetryContainer.setVisibility(View.GONE); + } else { + if (data.hasException()) { + mErrorMessageView.setText(data.getException().getMessage()); + mErrorMessageView.setVisibility(View.VISIBLE); + } + mListContainer.setVisibility(View.GONE); + mErrorRetryContainer.setVisibility(View.VISIBLE); + } + setProgressBarIndeterminateVisibility(false); + } - @Override - public boolean onMenuItemClick(final MenuItem item) { - final AsyncTwitterWrapper twitter = getTwitterWrapper(); - final ParcelableUserList userList = mUserList; - if (twitter == null || userList == null) return false; - switch (item.getItemId()) { - case MENU_ADD: { - if (userList.user_id != userList.account_id) return false; - final Intent intent = new Intent(INTENT_ACTION_SELECT_USER); - intent.setClass(getActivity(), UserListSelectorActivity.class); - intent.putExtra(EXTRA_ACCOUNT_ID, userList.account_id); - startActivityForResult(intent, REQUEST_SELECT_USER); - break; - } - case MENU_DELETE: { - if (userList.user_id != userList.account_id) return false; - DestroyUserListDialogFragment.show(getFragmentManager(), userList); - break; - } - case MENU_EDIT: { - final Bundle args = new Bundle(); - args.putLong(EXTRA_ACCOUNT_ID, userList.account_id); - args.putString(EXTRA_LIST_NAME, userList.name); - args.putString(EXTRA_DESCRIPTION, userList.description); - args.putBoolean(EXTRA_IS_PUBLIC, userList.is_public); - args.putLong(EXTRA_LIST_ID, userList.id); - final DialogFragment f = new EditUserListDialogFragment(); - f.setArguments(args); - f.show(getFragmentManager(), "edit_user_list_details"); - return true; - } - case MENU_FOLLOW: { - if (userList.is_following) { - DestroyUserListSubscriptionDialogFragment.show(getFragmentManager(), userList); - } else { - twitter.createUserListSubscriptionAsync(userList.account_id, userList.id); - } - return true; - } - default: { - if (item.getIntent() != null) { - try { - startActivity(item.getIntent()); - } catch (final ActivityNotFoundException e) { - Log.w(LOGTAG, e); - return false; - } - } - break; - } - } - return true; - } + @Override + public boolean onMenuItemClick(final MenuItem item) { + final AsyncTwitterWrapper twitter = getTwitterWrapper(); + final ParcelableUserList userList = mUserList; + if (twitter == null || userList == null) return false; + switch (item.getItemId()) { + case MENU_ADD: { + if (userList.user_id != userList.account_id) return false; + final Intent intent = new Intent(INTENT_ACTION_SELECT_USER); + intent.setClass(getActivity(), UserListSelectorActivity.class); + intent.putExtra(EXTRA_ACCOUNT_ID, userList.account_id); + startActivityForResult(intent, REQUEST_SELECT_USER); + break; + } + case MENU_DELETE: { + if (userList.user_id != userList.account_id) return false; + DestroyUserListDialogFragment.show(getFragmentManager(), userList); + break; + } + case MENU_EDIT: { + final Bundle args = new Bundle(); + args.putLong(EXTRA_ACCOUNT_ID, userList.account_id); + args.putString(EXTRA_LIST_NAME, userList.name); + args.putString(EXTRA_DESCRIPTION, userList.description); + args.putBoolean(EXTRA_IS_PUBLIC, userList.is_public); + args.putLong(EXTRA_LIST_ID, userList.id); + final DialogFragment f = new EditUserListDialogFragment(); + f.setArguments(args); + f.show(getFragmentManager(), "edit_user_list_details"); + return true; + } + case MENU_FOLLOW: { + if (userList.is_following) { + DestroyUserListSubscriptionDialogFragment.show(getFragmentManager(), userList); + } else { + twitter.createUserListSubscriptionAsync(userList.account_id, userList.id); + } + return true; + } + default: { + if (item.getIntent() != null) { + try { + startActivity(item.getIntent()); + } catch (final ActivityNotFoundException e) { + Log.w(LOGTAG, e); + return false; + } + } + break; + } + } + return true; + } - @Override - public void onStart() { - super.onStart(); - final IntentFilter filter = new IntentFilter(BROADCAST_USER_LIST_DETAILS_UPDATED); - filter.addAction(BROADCAST_USER_LIST_SUBSCRIBED); - filter.addAction(BROADCAST_USER_LIST_UNSUBSCRIBED); - registerReceiver(mStatusReceiver, filter); - } + @Override + public void onStart() { + super.onStart(); + final IntentFilter filter = new IntentFilter(BROADCAST_USER_LIST_DETAILS_UPDATED); + filter.addAction(BROADCAST_USER_LIST_SUBSCRIBED); + filter.addAction(BROADCAST_USER_LIST_UNSUBSCRIBED); + registerReceiver(mStatusReceiver, filter); + } - @Override - public void onStop() { - unregisterReceiver(mStatusReceiver); - super.onStop(); - } + @Override + public void onStop() { + unregisterReceiver(mStatusReceiver); + super.onStop(); + } - @Override - public void onViewCreated(final View view, final Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - } + @Override + public void onViewCreated(final View view, final Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + } - private void setMenu(final Menu menu) { - final AsyncTwitterWrapper twitter = getTwitterWrapper(); - final ParcelableUserList userList = mUserList; - final MenuItem followItem = menu.findItem(MENU_FOLLOW); - if (followItem != null) { - followItem.setEnabled(userList != null); - if (userList == null) { - followItem.setIcon(android.R.color.transparent); - } - } - if (twitter == null || userList == null) return; - final boolean isMyList = userList.user_id == userList.account_id; - setMenuItemAvailability(menu, MENU_EDIT, isMyList); - setMenuItemAvailability(menu, MENU_ADD, isMyList); - setMenuItemAvailability(menu, MENU_DELETE, isMyList); - final boolean isFollowing = userList.is_following; - if (followItem != null) { - followItem.setVisible(!isMyList); - if (isFollowing) { - followItem.setIcon(R.drawable.ic_action_cancel); - followItem.setTitle(R.string.unsubscribe); - } else { - followItem.setIcon(R.drawable.ic_action_add); - followItem.setTitle(R.string.subscribe); - } - } - menu.removeGroup(MENU_GROUP_USER_LIST_EXTENSION); - final Intent extensionsIntent = new Intent(INTENT_ACTION_EXTENSION_OPEN_USER_LIST); - extensionsIntent.setExtrasClassLoader(getActivity().getClassLoader()); - extensionsIntent.putExtra(EXTRA_USER_LIST, mUserList); - addIntentToMenu(getActivity(), menu, extensionsIntent, MENU_GROUP_USER_LIST_EXTENSION); - } + private void setMenu(final Menu menu) { + final AsyncTwitterWrapper twitter = getTwitterWrapper(); + final ParcelableUserList userList = mUserList; + final MenuItem followItem = menu.findItem(MENU_FOLLOW); + if (followItem != null) { + followItem.setEnabled(userList != null); + if (userList == null) { + followItem.setIcon(android.R.color.transparent); + } + } + if (twitter == null || userList == null) return; + final boolean isMyList = userList.user_id == userList.account_id; + setMenuItemAvailability(menu, MENU_EDIT, isMyList); + setMenuItemAvailability(menu, MENU_ADD, isMyList); + setMenuItemAvailability(menu, MENU_DELETE, isMyList); + final boolean isFollowing = userList.is_following; + if (followItem != null) { + followItem.setVisible(!isMyList); + if (isFollowing) { + followItem.setIcon(R.drawable.ic_action_cancel); + followItem.setTitle(R.string.unsubscribe); + } else { + followItem.setIcon(R.drawable.ic_action_add); + followItem.setTitle(R.string.subscribe); + } + } + menu.removeGroup(MENU_GROUP_USER_LIST_EXTENSION); + final Intent extensionsIntent = new Intent(INTENT_ACTION_EXTENSION_OPEN_USER_LIST); + extensionsIntent.setExtrasClassLoader(getActivity().getClassLoader()); + extensionsIntent.putExtra(EXTRA_USER_LIST, mUserList); + addIntentToMenu(getActivity(), menu, extensionsIntent, MENU_GROUP_USER_LIST_EXTENSION); + } - public static class EditUserListDialogFragment extends BaseSupportDialogFragment implements - DialogInterface.OnClickListener { + public static class EditUserListDialogFragment extends BaseSupportDialogFragment implements + DialogInterface.OnClickListener { - private EditText mEditName, mEditDescription; - private CheckBox mPublicCheckBox; - private String mName, mDescription; - private long mAccountId; - private long mListId; - private boolean mIsPublic; - private AsyncTwitterWrapper mTwitterWrapper; + private EditText mEditName, mEditDescription; + private CheckBox mPublicCheckBox; + private String mName, mDescription; + private long mAccountId; + private long mListId; + private boolean mIsPublic; + private AsyncTwitterWrapper mTwitterWrapper; - @Override - public void onClick(final DialogInterface dialog, final int which) { - if (mAccountId <= 0) return; - switch (which) { - case DialogInterface.BUTTON_POSITIVE: { - mName = ParseUtils.parseString(mEditName.getText()); - mDescription = ParseUtils.parseString(mEditDescription.getText()); - mIsPublic = mPublicCheckBox.isChecked(); - if (mName == null || mName.length() <= 0) return; - mTwitterWrapper.updateUserListDetails(mAccountId, mListId, mIsPublic, mName, mDescription); - break; - } - } + @Override + public void onClick(final DialogInterface dialog, final int which) { + if (mAccountId <= 0) return; + switch (which) { + case DialogInterface.BUTTON_POSITIVE: { + mName = ParseUtils.parseString(mEditName.getText()); + mDescription = ParseUtils.parseString(mEditDescription.getText()); + mIsPublic = mPublicCheckBox.isChecked(); + if (mName == null || mName.length() <= 0) return; + mTwitterWrapper.updateUserListDetails(mAccountId, mListId, mIsPublic, mName, mDescription); + break; + } + } - } + } - @Override - public Dialog onCreateDialog(final Bundle savedInstanceState) { - mTwitterWrapper = getApplication().getTwitterWrapper(); - final Bundle bundle = savedInstanceState == null ? getArguments() : savedInstanceState; - mAccountId = bundle != null ? bundle.getLong(EXTRA_ACCOUNT_ID, -1) : -1; - mListId = bundle != null ? bundle.getLong(EXTRA_LIST_ID, -1) : -1; - mName = bundle != null ? bundle.getString(EXTRA_LIST_NAME) : null; - mDescription = bundle != null ? bundle.getString(EXTRA_DESCRIPTION) : null; - mIsPublic = bundle != null ? bundle.getBoolean(EXTRA_IS_PUBLIC, true) : true; - final Context wrapped = ThemeUtils.getDialogThemedContext(getActivity()); - final AlertDialog.Builder builder = new AlertDialog.Builder(wrapped); - final View view = LayoutInflater.from(wrapped).inflate(R.layout.edit_user_list_detail, null); - builder.setView(view); - mEditName = (EditText) view.findViewById(R.id.name); - mEditDescription = (EditText) view.findViewById(R.id.description); - mPublicCheckBox = (CheckBox) view.findViewById(R.id.is_public); - if (mName != null) { - mEditName.setText(mName); - } - if (mDescription != null) { - mEditDescription.setText(mDescription); - } - mPublicCheckBox.setChecked(mIsPublic); - builder.setTitle(R.string.user_list); - builder.setPositiveButton(android.R.string.ok, this); - builder.setNegativeButton(android.R.string.cancel, this); - return builder.create(); - } + @Override + public Dialog onCreateDialog(final Bundle savedInstanceState) { + mTwitterWrapper = getApplication().getTwitterWrapper(); + final Bundle bundle = savedInstanceState == null ? getArguments() : savedInstanceState; + mAccountId = bundle != null ? bundle.getLong(EXTRA_ACCOUNT_ID, -1) : -1; + mListId = bundle != null ? bundle.getLong(EXTRA_LIST_ID, -1) : -1; + mName = bundle != null ? bundle.getString(EXTRA_LIST_NAME) : null; + mDescription = bundle != null ? bundle.getString(EXTRA_DESCRIPTION) : null; + mIsPublic = bundle != null ? bundle.getBoolean(EXTRA_IS_PUBLIC, true) : true; + final Context wrapped = ThemeUtils.getDialogThemedContext(getActivity()); + final AlertDialog.Builder builder = new AlertDialog.Builder(wrapped); + final View view = LayoutInflater.from(wrapped).inflate(R.layout.edit_user_list_detail, null); + builder.setView(view); + mEditName = (EditText) view.findViewById(R.id.name); + mEditDescription = (EditText) view.findViewById(R.id.description); + mPublicCheckBox = (CheckBox) view.findViewById(R.id.is_public); + if (mName != null) { + mEditName.setText(mName); + } + if (mDescription != null) { + mEditDescription.setText(mDescription); + } + mPublicCheckBox.setChecked(mIsPublic); + builder.setTitle(R.string.user_list); + builder.setPositiveButton(android.R.string.ok, this); + builder.setNegativeButton(android.R.string.cancel, this); + return builder.create(); + } - @Override - public void onSaveInstanceState(final Bundle outState) { - outState.putLong(EXTRA_ACCOUNT_ID, mAccountId); - outState.putLong(EXTRA_LIST_ID, mListId); - outState.putString(EXTRA_LIST_NAME, mName); - outState.putString(EXTRA_DESCRIPTION, mDescription); - outState.putBoolean(EXTRA_IS_PUBLIC, mIsPublic); - super.onSaveInstanceState(outState); - } + @Override + public void onSaveInstanceState(final Bundle outState) { + outState.putLong(EXTRA_ACCOUNT_ID, mAccountId); + outState.putLong(EXTRA_LIST_ID, mListId); + outState.putString(EXTRA_LIST_NAME, mName); + outState.putString(EXTRA_DESCRIPTION, mDescription); + outState.putBoolean(EXTRA_IS_PUBLIC, mIsPublic); + super.onSaveInstanceState(outState); + } - } + } - class ListMembersAction extends ListAction { + class ListMembersAction extends ListAction { - public ListMembersAction(final int order) { - super(order); - } + public ListMembersAction(final int order) { + super(order); + } - @Override - public String getName() { - return getString(R.string.list_members); - } + @Override + public String getName() { + return getString(R.string.list_members); + } - @Override - public String getSummary() { - if (mUserList == null) return null; - return getLocalizedNumber(mLocale, mUserList.members_count); - } + @Override + public String getSummary() { + if (mUserList == null) return null; + return getLocalizedNumber(mLocale, mUserList.members_count); + } - @Override - public void onClick() { - openUserListMembers(getActivity(), mUserList); - } + @Override + public void onClick() { + openUserListMembers(getActivity(), mUserList); + } - } + } - class ListSubscribersAction extends ListAction { + class ListSubscribersAction extends ListAction { - public ListSubscribersAction(final int order) { - super(order); - } + public ListSubscribersAction(final int order) { + super(order); + } - @Override - public String getName() { - return getString(R.string.list_subscribers); - } + @Override + public String getName() { + return getString(R.string.list_subscribers); + } - @Override - public String getSummary() { - if (mUserList == null) return null; - return getLocalizedNumber(mLocale, mUserList.subscribers_count); - } + @Override + public String getSummary() { + if (mUserList == null) return null; + return getLocalizedNumber(mLocale, mUserList.subscribers_count); + } - @Override - public void onClick() { - openUserListSubscribers(getActivity(), mUserList); - } + @Override + public void onClick() { + openUserListSubscribers(getActivity(), mUserList); + } - } + } - class ListTimelineAction extends ListAction { + class ListTimelineAction extends ListAction { - public ListTimelineAction(final int order) { - super(order); - } + public ListTimelineAction(final int order) { + super(order); + } - @Override - public String getName() { - return getString(R.string.list_timeline); - } + @Override + public String getName() { + return getString(R.string.list_timeline); + } - @Override - public void onClick() { - if (mUserList == null) return; - openUserListTimeline(getActivity(), mUserList); - } + @Override + public void onClick() { + if (mUserList == null) return; + openUserListTimeline(getActivity(), mUserList); + } - } + } - static class ParcelableUserListLoader extends AsyncTaskLoader> { + static class ParcelableUserListLoader extends AsyncTaskLoader> { - private final boolean mOmitIntentExtra; - private final Bundle mExtras; - private final long mAccountId, mUserId; - private final int mListId; - private final String mScreenName, mListName; + private final boolean mOmitIntentExtra; + private final Bundle mExtras; + private final long mAccountId, mUserId; + private final int mListId; + private final String mScreenName, mListName; - private ParcelableUserListLoader(final Context context, final boolean omitIntentExtra, final Bundle extras, - final long accountId, final int listId, final String listName, final long userId, - final String screenName) { - super(context); - mOmitIntentExtra = omitIntentExtra; - mExtras = extras; - mAccountId = accountId; - mUserId = userId; - mListId = listId; - mScreenName = screenName; - mListName = listName; - } + private ParcelableUserListLoader(final Context context, final boolean omitIntentExtra, final Bundle extras, + final long accountId, final int listId, final String listName, final long userId, + final String screenName) { + super(context); + mOmitIntentExtra = omitIntentExtra; + mExtras = extras; + mAccountId = accountId; + mUserId = userId; + mListId = listId; + mScreenName = screenName; + mListName = listName; + } - @Override - public SingleResponse loadInBackground() { - if (!mOmitIntentExtra && mExtras != null) { - final ParcelableUserList cache = mExtras.getParcelable(EXTRA_USER_LIST); - if (cache != null) return SingleResponse.getInstance(cache); - } - final Twitter twitter = getTwitterInstance(getContext(), mAccountId, true); - if (twitter == null) return SingleResponse.getInstance(); - try { - final UserList list; - if (mListId > 0) { - list = twitter.showUserList(mListId); - } else if (mUserId > 0) { - list = twitter.showUserList(mListName, mUserId); - } else if (mScreenName != null) { - list = twitter.showUserList(mListName, mScreenName); - } else - return SingleResponse.getInstance(); - return new SingleResponse(new ParcelableUserList(list, mAccountId), null); - } catch (final TwitterException e) { - return new SingleResponse(null, e); - } - } + @Override + public SingleResponse loadInBackground() { + if (!mOmitIntentExtra && mExtras != null) { + final ParcelableUserList cache = mExtras.getParcelable(EXTRA_USER_LIST); + if (cache != null) return SingleResponse.getInstance(cache); + } + final Twitter twitter = getTwitterInstance(getContext(), mAccountId, true); + if (twitter == null) return SingleResponse.getInstance(); + try { + final UserList list; + if (mListId > 0) { + list = twitter.showUserList(mListId); + } else if (mUserId > 0) { + list = twitter.showUserList(mListName, mUserId); + } else if (mScreenName != null) { + list = twitter.showUserList(mListName, mScreenName); + } else + return SingleResponse.getInstance(); + return new SingleResponse(new ParcelableUserList(list, mAccountId), null); + } catch (final TwitterException e) { + return new SingleResponse(null, e); + } + } - @Override - public void onStartLoading() { - forceLoad(); - } + @Override + public void onStartLoading() { + forceLoad(); + } - } + } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserProfileFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserProfileFragment.java index 8b374a99c..e93e0afb1 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserProfileFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserProfileFragment.java @@ -83,6 +83,7 @@ import org.mariotaku.twidere.provider.TweetStore.Accounts; import org.mariotaku.twidere.provider.TweetStore.CachedUsers; import org.mariotaku.twidere.provider.TweetStore.Filters; import org.mariotaku.twidere.util.AsyncTwitterWrapper; +import org.mariotaku.twidere.util.ContentValuesCreator; import org.mariotaku.twidere.util.FlymeUtils; import org.mariotaku.twidere.util.ImageLoaderWrapper; import org.mariotaku.twidere.util.ParseUtils; @@ -92,6 +93,7 @@ import org.mariotaku.twidere.util.TwidereLinkify.OnLinkClickListener; import org.mariotaku.twidere.view.ColorLabelLinearLayout; import org.mariotaku.twidere.view.ExtendedFrameLayout; import org.mariotaku.twidere.view.ProfileImageView; +import org.mariotaku.twidere.view.TwidereMenuBar; import org.mariotaku.twidere.view.iface.IExtendedView.OnSizeChangedListener; import java.util.Locale; @@ -101,7 +103,6 @@ import twitter4j.Twitter; import twitter4j.TwitterException; import static android.text.TextUtils.isEmpty; -import static org.mariotaku.twidere.util.ContentValuesCreator.makeFilterdUserContentValues; import static org.mariotaku.twidere.util.ParseUtils.parseLong; import static org.mariotaku.twidere.util.UserColorNicknameUtils.clearUserColor; import static org.mariotaku.twidere.util.UserColorNicknameUtils.clearUserNickname; @@ -161,7 +162,7 @@ public class UserProfileFragment extends BaseSupportListFragment implements OnCl private View mMainContent; private View mProfileBannerSpace; private ProgressBar mDetailsLoadProgress; - private MenuBar mMenuBar; + private TwidereMenuBar mMenuBar; private ListActionAdapter mAdapter; @@ -720,7 +721,7 @@ public class UserProfileFragment extends BaseSupportListFragment implements OnCl super.onViewCreated(view, savedInstanceState); mMainContent = view.findViewById(R.id.content); mDetailsLoadProgress = (ProgressBar) view.findViewById(R.id.details_load_progress); - mMenuBar = (MenuBar) view.findViewById(R.id.menu_bar); + mMenuBar = (TwidereMenuBar) view.findViewById(R.id.menu_bar); mErrorRetryContainer = view.findViewById(R.id.error_retry_container); mRetryButton = (Button) view.findViewById(R.id.retry); mErrorMessageView = (TextView) view.findViewById(R.id.error_message); @@ -792,7 +793,7 @@ public class UserProfileFragment extends BaseSupportListFragment implements OnCl case MENU_ADD_TO_FILTER: { final ContentResolver resolver = getContentResolver(); resolver.delete(Filters.Users.CONTENT_URI, Where.equals(Filters.Users.USER_ID, user.id).getSQL(), null); - resolver.insert(Filters.Users.CONTENT_URI, makeFilterdUserContentValues(user)); + resolver.insert(Filters.Users.CONTENT_URI, ContentValuesCreator.makeFilteredUserContentValues(user)); showInfoMessage(getActivity(), R.string.message_user_muted, false); break; } diff --git a/twidere/src/main/java/org/mariotaku/twidere/model/Account.java b/twidere/src/main/java/org/mariotaku/twidere/model/Account.java index 404632d81..d411fe6b3 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/model/Account.java +++ b/twidere/src/main/java/org/mariotaku/twidere/model/Account.java @@ -19,9 +19,6 @@ package org.mariotaku.twidere.model; -import static org.mariotaku.twidere.util.Utils.isOfficialConsumerKeySecret; -import static org.mariotaku.twidere.util.Utils.shouldForceUsingPrivateAPIs; - import android.content.Context; import android.database.Cursor; import android.graphics.Color; @@ -38,263 +35,268 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import static org.mariotaku.twidere.util.Utils.isOfficialConsumerKeySecret; +import static org.mariotaku.twidere.util.Utils.shouldForceUsingPrivateAPIs; + public class Account implements Parcelable { - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - @Override - public Account createFromParcel(final Parcel in) { - return new Account(in); - } + @Override + public Account createFromParcel(final Parcel in) { + return new Account(in); + } - @Override - public Account[] newArray(final int size) { - return new Account[size]; - } - }; + @Override + public Account[] newArray(final int size) { + return new Account[size]; + } + }; - public final String screen_name, name, profile_image_url, profile_banner_url; - public final long account_id; - public final int color; - public final boolean is_activated; - public final boolean is_dummy; + public final String screen_name, name, profile_image_url, profile_banner_url; + public final long account_id; + public final int color; + public final boolean is_activated; + public final boolean is_dummy; - public Account(final Cursor cursor, final Indices indices) { - is_dummy = false; - screen_name = indices.screen_name != -1 ? cursor.getString(indices.screen_name) : null; - name = indices.name != -1 ? cursor.getString(indices.name) : null; - account_id = indices.account_id != -1 ? cursor.getLong(indices.account_id) : -1; - profile_image_url = indices.profile_image_url != -1 ? cursor.getString(indices.profile_image_url) : null; - profile_banner_url = indices.profile_banner_url != -1 ? cursor.getString(indices.profile_banner_url) : null; - color = indices.color != -1 ? cursor.getInt(indices.color) : Color.TRANSPARENT; - is_activated = indices.is_activated != -1 ? cursor.getInt(indices.is_activated) == 1 : false; - } + public Account(final Cursor cursor, final Indices indices) { + is_dummy = false; + screen_name = indices.screen_name != -1 ? cursor.getString(indices.screen_name) : null; + name = indices.name != -1 ? cursor.getString(indices.name) : null; + account_id = indices.account_id != -1 ? cursor.getLong(indices.account_id) : -1; + profile_image_url = indices.profile_image_url != -1 ? cursor.getString(indices.profile_image_url) : null; + profile_banner_url = indices.profile_banner_url != -1 ? cursor.getString(indices.profile_banner_url) : null; + color = indices.color != -1 ? cursor.getInt(indices.color) : Color.TRANSPARENT; + is_activated = indices.is_activated != -1 ? cursor.getInt(indices.is_activated) == 1 : false; + } - public Account(final Parcel source) { - is_dummy = source.readInt() == 1; - is_activated = source.readInt() == 1; - account_id = source.readLong(); - name = source.readString(); - screen_name = source.readString(); - profile_image_url = source.readString(); - profile_banner_url = source.readString(); - color = source.readInt(); - } + public Account(final Parcel source) { + is_dummy = source.readInt() == 1; + is_activated = source.readInt() == 1; + account_id = source.readLong(); + name = source.readString(); + screen_name = source.readString(); + profile_image_url = source.readString(); + profile_banner_url = source.readString(); + color = source.readInt(); + } - private Account() { - is_dummy = true; - screen_name = null; - name = null; - account_id = -1; - profile_image_url = null; - profile_banner_url = null; - color = 0; - is_activated = false; - } + private Account() { + is_dummy = true; + screen_name = null; + name = null; + account_id = -1; + profile_image_url = null; + profile_banner_url = null; + color = 0; + is_activated = false; + } - @Override - public int describeContents() { - return 0; - } + @Override + public int describeContents() { + return 0; + } - @Override - public String toString() { - return "Account{screen_name=" + screen_name + ", name=" + name + ", profile_image_url=" + profile_image_url - + ", profile_banner_url=" + profile_banner_url + ", account_id=" + account_id + ", color=" + color - + ", is_activated=" + is_activated + ", is_dummy=" + is_dummy + "}"; - } + @Override + public String toString() { + return "Account{screen_name=" + screen_name + ", name=" + name + ", profile_image_url=" + profile_image_url + + ", profile_banner_url=" + profile_banner_url + ", account_id=" + account_id + ", color=" + color + + ", is_activated=" + is_activated + ", is_dummy=" + is_dummy + "}"; + } - @Override - public void writeToParcel(final Parcel out, final int flags) { - out.writeInt(is_dummy ? 1 : 0); - out.writeInt(is_activated ? 1 : 0); - out.writeLong(account_id); - out.writeString(name); - out.writeString(screen_name); - out.writeString(profile_image_url); - out.writeString(profile_banner_url); - out.writeInt(color); - } + @Override + public void writeToParcel(final Parcel out, final int flags) { + out.writeInt(is_dummy ? 1 : 0); + out.writeInt(is_activated ? 1 : 0); + out.writeLong(account_id); + out.writeString(name); + out.writeString(screen_name); + out.writeString(profile_image_url); + out.writeString(profile_banner_url); + out.writeInt(color); + } - public static Account dummyInstance() { - return new Account(); - } + public static Account dummyInstance() { + return new Account(); + } - public static Account getAccount(final Context context, final long account_id) { - if (context == null) return null; - final Cursor cur = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI, - Accounts.COLUMNS, Accounts.ACCOUNT_ID + " = " + account_id, null, null); - if (cur != null) { - try { - if (cur.getCount() > 0 && cur.moveToFirst()) { - final Indices indices = new Indices(cur); - cur.moveToFirst(); - return new Account(cur, indices); - } - } finally { - cur.close(); - } - } - return null; - } + public static Account getAccount(final Context context, final long account_id) { + if (context == null) return null; + final Cursor cur = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI, + Accounts.COLUMNS, Accounts.ACCOUNT_ID + " = " + account_id, null, null); + if (cur != null) { + try { + if (cur.getCount() > 0 && cur.moveToFirst()) { + final Indices indices = new Indices(cur); + cur.moveToFirst(); + return new Account(cur, indices); + } + } finally { + cur.close(); + } + } + return null; + } - public static long[] getAccountIds(final Account[] accounts) { - final long[] ids = new long[accounts.length]; - for (int i = 0, j = accounts.length; i < j; i++) { - ids[i] = accounts[i].account_id; - } - return ids; - } + public static long[] getAccountIds(final Account[] accounts) { + final long[] ids = new long[accounts.length]; + for (int i = 0, j = accounts.length; i < j; i++) { + ids[i] = accounts[i].account_id; + } + return ids; + } - public static Account[] getAccounts(final Context context, final boolean activatedOnly, - final boolean officialKeyOnly) { - final List list = getAccountsList(context, activatedOnly, officialKeyOnly); - return list.toArray(new Account[list.size()]); - } + public static Account[] getAccounts(final Context context, final boolean activatedOnly, + final boolean officialKeyOnly) { + final List list = getAccountsList(context, activatedOnly, officialKeyOnly); + return list.toArray(new Account[list.size()]); + } - public static Account[] getAccounts(final Context context, final long[] accountIds) { - if (context == null) return new Account[0]; - final String where = accountIds != null ? Where.in(new Column(Accounts.ACCOUNT_ID), - new RawItemArray(accountIds)).getSQL() : null; - final Cursor cur = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI, - Accounts.COLUMNS_NO_CREDENTIALS, where, null, null); - if (cur == null) return new Account[0]; - try { - final Indices idx = new Indices(cur); - cur.moveToFirst(); - final Account[] names = new Account[cur.getCount()]; - while (!cur.isAfterLast()) { - names[cur.getPosition()] = new Account(cur, idx); - cur.moveToNext(); - } - return names; - } finally { - cur.close(); - } - } + public static Account[] getAccounts(final Context context, final long[] accountIds) { + if (context == null) return new Account[0]; + final String where = accountIds != null ? Where.in(new Column(Accounts.ACCOUNT_ID), + new RawItemArray(accountIds)).getSQL() : null; + final Cursor cur = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI, + Accounts.COLUMNS_NO_CREDENTIALS, where, null, null); + if (cur == null) return new Account[0]; + try { + final Indices idx = new Indices(cur); + cur.moveToFirst(); + final Account[] names = new Account[cur.getCount()]; + while (!cur.isAfterLast()) { + names[cur.getPosition()] = new Account(cur, idx); + cur.moveToNext(); + } + return names; + } finally { + cur.close(); + } + } - public static List getAccountsList(final Context context, final boolean activatedOnly) { - return getAccountsList(context, activatedOnly, false); - } + public static List getAccountsList(final Context context, final boolean activatedOnly) { + return getAccountsList(context, activatedOnly, false); + } - public static List getAccountsList(final Context context, final boolean activatedOnly, - final boolean officialKeyOnly) { - if (context == null) return Collections.emptyList(); - final ArrayList accounts = new ArrayList(); - final Cursor cur = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI, - Accounts.COLUMNS_NO_CREDENTIALS, activatedOnly ? Accounts.IS_ACTIVATED + " = 1" : null, null, null); - if (cur != null) { - final Indices indices = new Indices(cur); - cur.moveToFirst(); - while (!cur.isAfterLast()) { - if (!officialKeyOnly) { - accounts.add(new Account(cur, indices)); - } else { - final String consumerKey = cur.getString(indices.consumer_key); - final String consumerSecret = cur.getString(indices.consumer_secret); - if (shouldForceUsingPrivateAPIs(context) - || isOfficialConsumerKeySecret(context, consumerKey, consumerSecret)) { - accounts.add(new Account(cur, indices)); - } - } - cur.moveToNext(); - } - cur.close(); - } - return accounts; - } + public static List getAccountsList(final Context context, final boolean activatedOnly, + final boolean officialKeyOnly) { + if (context == null) return Collections.emptyList(); + final ArrayList accounts = new ArrayList(); + final Cursor cur = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI, + Accounts.COLUMNS_NO_CREDENTIALS, activatedOnly ? Accounts.IS_ACTIVATED + " = 1" : null, null, null); + if (cur != null) { + final Indices indices = new Indices(cur); + cur.moveToFirst(); + while (!cur.isAfterLast()) { + if (!officialKeyOnly) { + accounts.add(new Account(cur, indices)); + } else { + final String consumerKey = cur.getString(indices.consumer_key); + final String consumerSecret = cur.getString(indices.consumer_secret); + if (shouldForceUsingPrivateAPIs(context) + || isOfficialConsumerKeySecret(context, consumerKey, consumerSecret)) { + accounts.add(new Account(cur, indices)); + } + } + cur.moveToNext(); + } + cur.close(); + } + return accounts; + } - public static AccountWithCredentials getAccountWithCredentials(final Context context, final long account_id) { - if (context == null) return null; - final Cursor cur = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI, - Accounts.COLUMNS, Accounts.ACCOUNT_ID + " = " + account_id, null, null); - if (cur != null) { - try { - if (cur.getCount() > 0 && cur.moveToFirst()) { - final Indices indices = new Indices(cur); - cur.moveToFirst(); - return new AccountWithCredentials(cur, indices); - } - } finally { - cur.close(); - } - } - return null; - } + public static AccountWithCredentials getAccountWithCredentials(final Context context, final long account_id) { + if (context == null) return null; + final Cursor cur = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI, + Accounts.COLUMNS, Accounts.ACCOUNT_ID + " = " + account_id, null, null); + if (cur != null) { + try { + if (cur.getCount() > 0 && cur.moveToFirst()) { + final Indices indices = new Indices(cur); + cur.moveToFirst(); + return new AccountWithCredentials(cur, indices); + } + } finally { + cur.close(); + } + } + return null; + } - public static class AccountWithCredentials extends Account { + public static class AccountWithCredentials extends Account { - public final int auth_type; - public final String consumer_key, consumer_secret; - public final String basic_auth_username, basic_auth_password; - public final String oauth_token, oauth_token_secret; - public final String api_url_format; - public final boolean same_oauth_signing_url; + public final int auth_type; + public final String consumer_key, consumer_secret; + public final String basic_auth_username, basic_auth_password; + public final String oauth_token, oauth_token_secret; + public final String api_url_format; + public final boolean same_oauth_signing_url, no_version_suffix; - public AccountWithCredentials(final Cursor cursor, final Indices indices) { - super(cursor, indices); - auth_type = cursor.getInt(indices.auth_type); - consumer_key = cursor.getString(indices.consumer_key); - consumer_secret = cursor.getString(indices.consumer_secret); - basic_auth_username = cursor.getString(indices.basic_auth_username); - basic_auth_password = cursor.getString(indices.basic_auth_password); - oauth_token = cursor.getString(indices.oauth_token); - oauth_token_secret = cursor.getString(indices.oauth_token_secret); - api_url_format = cursor.getString(indices.api_url_format); - same_oauth_signing_url = cursor.getInt(indices.same_oauth_signing_url) == 1; - } + public AccountWithCredentials(final Cursor cursor, final Indices indices) { + super(cursor, indices); + auth_type = cursor.getInt(indices.auth_type); + consumer_key = cursor.getString(indices.consumer_key); + consumer_secret = cursor.getString(indices.consumer_secret); + basic_auth_username = cursor.getString(indices.basic_auth_username); + basic_auth_password = cursor.getString(indices.basic_auth_password); + oauth_token = cursor.getString(indices.oauth_token); + oauth_token_secret = cursor.getString(indices.oauth_token_secret); + api_url_format = cursor.getString(indices.api_url_format); + same_oauth_signing_url = cursor.getInt(indices.same_oauth_signing_url) == 1; + no_version_suffix = cursor.getInt(indices.no_version_suffix) == 1; + } - @Override - public String toString() { - return "AccountWithCredentials{auth_type=" + auth_type + ", consumer_key=" + consumer_key - + ", consumer_secret=" + consumer_secret + ", basic_auth_password=" + basic_auth_password - + ", oauth_token=" + oauth_token + ", oauth_token_secret=" + oauth_token_secret - + ", api_url_format=" + api_url_format + ", same_oauth_signing_url=" + same_oauth_signing_url + "}"; - } + @Override + public String toString() { + return "AccountWithCredentials{auth_type=" + auth_type + ", consumer_key=" + consumer_key + + ", consumer_secret=" + consumer_secret + ", basic_auth_password=" + basic_auth_password + + ", oauth_token=" + oauth_token + ", oauth_token_secret=" + oauth_token_secret + + ", api_url_format=" + api_url_format + ", same_oauth_signing_url=" + same_oauth_signing_url + "}"; + } - public static final boolean isOfficialCredentials(final Context context, final AccountWithCredentials account) { - if (account == null) return false; - final boolean isOAuth = account.auth_type == Accounts.AUTH_TYPE_OAUTH - || account.auth_type == Accounts.AUTH_TYPE_XAUTH; - final String consumerKey = account.consumer_key, consumerSecret = account.consumer_secret; - return isOAuth && isOfficialConsumerKeySecret(context, consumerKey, consumerSecret); - } - } + public static final boolean isOfficialCredentials(final Context context, final AccountWithCredentials account) { + if (account == null) return false; + final boolean isOAuth = account.auth_type == Accounts.AUTH_TYPE_OAUTH + || account.auth_type == Accounts.AUTH_TYPE_XAUTH; + final String consumerKey = account.consumer_key, consumerSecret = account.consumer_secret; + return isOAuth && isOfficialConsumerKeySecret(context, consumerKey, consumerSecret); + } + } - public static final class Indices { + public static final class Indices { - public final int screen_name, name, account_id, profile_image_url, profile_banner_url, color, is_activated, - auth_type, consumer_key, consumer_secret, basic_auth_username, basic_auth_password, oauth_token, - oauth_token_secret, api_url_format, same_oauth_signing_url; + public final int screen_name, name, account_id, profile_image_url, profile_banner_url, color, is_activated, + auth_type, consumer_key, consumer_secret, basic_auth_username, basic_auth_password, oauth_token, + oauth_token_secret, api_url_format, same_oauth_signing_url, no_version_suffix; - public Indices(final Cursor cursor) { - screen_name = cursor.getColumnIndex(Accounts.SCREEN_NAME); - name = cursor.getColumnIndex(Accounts.NAME); - account_id = cursor.getColumnIndex(Accounts.ACCOUNT_ID); - profile_image_url = cursor.getColumnIndex(Accounts.PROFILE_IMAGE_URL); - profile_banner_url = cursor.getColumnIndex(Accounts.PROFILE_BANNER_URL); - color = cursor.getColumnIndex(Accounts.COLOR); - is_activated = cursor.getColumnIndex(Accounts.IS_ACTIVATED); - auth_type = cursor.getColumnIndex(Accounts.AUTH_TYPE); - consumer_key = cursor.getColumnIndex(Accounts.CONSUMER_KEY); - consumer_secret = cursor.getColumnIndex(Accounts.CONSUMER_SECRET); - basic_auth_username = cursor.getColumnIndex(Accounts.BASIC_AUTH_USERNAME); - basic_auth_password = cursor.getColumnIndex(Accounts.BASIC_AUTH_PASSWORD); - oauth_token = cursor.getColumnIndex(Accounts.OAUTH_TOKEN); - oauth_token_secret = cursor.getColumnIndex(Accounts.OAUTH_TOKEN_SECRET); - api_url_format = cursor.getColumnIndex(Accounts.API_URL_FORMAT); - same_oauth_signing_url = cursor.getColumnIndex(Accounts.SAME_OAUTH_SIGNING_URL); - } + public Indices(final Cursor cursor) { + screen_name = cursor.getColumnIndex(Accounts.SCREEN_NAME); + name = cursor.getColumnIndex(Accounts.NAME); + account_id = cursor.getColumnIndex(Accounts.ACCOUNT_ID); + profile_image_url = cursor.getColumnIndex(Accounts.PROFILE_IMAGE_URL); + profile_banner_url = cursor.getColumnIndex(Accounts.PROFILE_BANNER_URL); + color = cursor.getColumnIndex(Accounts.COLOR); + is_activated = cursor.getColumnIndex(Accounts.IS_ACTIVATED); + auth_type = cursor.getColumnIndex(Accounts.AUTH_TYPE); + consumer_key = cursor.getColumnIndex(Accounts.CONSUMER_KEY); + consumer_secret = cursor.getColumnIndex(Accounts.CONSUMER_SECRET); + basic_auth_username = cursor.getColumnIndex(Accounts.BASIC_AUTH_USERNAME); + basic_auth_password = cursor.getColumnIndex(Accounts.BASIC_AUTH_PASSWORD); + oauth_token = cursor.getColumnIndex(Accounts.OAUTH_TOKEN); + oauth_token_secret = cursor.getColumnIndex(Accounts.OAUTH_TOKEN_SECRET); + api_url_format = cursor.getColumnIndex(Accounts.API_URL_FORMAT); + same_oauth_signing_url = cursor.getColumnIndex(Accounts.SAME_OAUTH_SIGNING_URL); + no_version_suffix = cursor.getColumnIndex(Accounts.NO_VERSION_SUFFIX); + } - @Override - public String toString() { - return "Indices{screen_name=" + screen_name + ", name=" + name + ", account_id=" + account_id - + ", profile_image_url=" + profile_image_url + ", profile_banner_url=" + profile_banner_url - + ", color=" + color + ", is_activated=" + is_activated + ", auth_type=" + auth_type - + ", consumer_key=" + consumer_key + ", consumer_secret=" + consumer_secret - + ", basic_auth_password=" + basic_auth_password + ", oauth_token=" + oauth_token - + ", oauth_token_secret=" + oauth_token_secret + ", api_url_format=" + api_url_format - + ", same_oauth_signing_url=" + same_oauth_signing_url + "}"; - } - } + @Override + public String toString() { + return "Indices{screen_name=" + screen_name + ", name=" + name + ", account_id=" + account_id + + ", profile_image_url=" + profile_image_url + ", profile_banner_url=" + profile_banner_url + + ", color=" + color + ", is_activated=" + is_activated + ", auth_type=" + auth_type + + ", consumer_key=" + consumer_key + ", consumer_secret=" + consumer_secret + + ", basic_auth_password=" + basic_auth_password + ", oauth_token=" + oauth_token + + ", oauth_token_secret=" + oauth_token_secret + ", api_url_format=" + api_url_format + + ", same_oauth_signing_url=" + same_oauth_signing_url + "}"; + } + } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/provider/TweetStore.java b/twidere/src/main/java/org/mariotaku/twidere/provider/TweetStore.java index b01c152b9..cc192d5dd 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/provider/TweetStore.java +++ b/twidere/src/main/java/org/mariotaku/twidere/provider/TweetStore.java @@ -25,760 +25,761 @@ import android.provider.BaseColumns; public interface TweetStore { - public static final String AUTHORITY = "twidere"; - - public static final String TYPE_PRIMARY_KEY = "INTEGER PRIMARY KEY AUTOINCREMENT"; - public static final String TYPE_INT = "INTEGER"; - public static final String TYPE_INT_UNIQUE = "INTEGER UNIQUE"; - public static final String TYPE_BOOLEAN = "INTEGER(1)"; - public static final String TYPE_BOOLEAN_DEFAULT_TRUE = "INTEGER(1) DEFAULT 1"; - public static final String TYPE_TEXT = "TEXT"; - public static final String TYPE_TEXT_NOT_NULL = "TEXT NOT NULL"; - public static final String TYPE_TEXT_NOT_NULL_UNIQUE = "TEXT NOT NULL UNIQUE"; + public static final String AUTHORITY = "twidere"; + + public static final String TYPE_PRIMARY_KEY = "INTEGER PRIMARY KEY AUTOINCREMENT"; + public static final String TYPE_INT = "INTEGER"; + public static final String TYPE_INT_UNIQUE = "INTEGER UNIQUE"; + public static final String TYPE_BOOLEAN = "INTEGER(1)"; + public static final String TYPE_BOOLEAN_DEFAULT_TRUE = "INTEGER(1) DEFAULT 1"; + public static final String TYPE_TEXT = "TEXT"; + public static final String TYPE_TEXT_NOT_NULL = "TEXT NOT NULL"; + public static final String TYPE_TEXT_NOT_NULL_UNIQUE = "TEXT NOT NULL UNIQUE"; + + public static final String CONTENT_PATH_NULL = "null_content"; + + public static final String CONTENT_PATH_DATABASE_READY = "database_ready"; + + public static final Uri BASE_CONTENT_URI = new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT) + .authority(AUTHORITY).build(); + + public static final Uri CONTENT_URI_NULL = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH_NULL); + + public static final Uri CONTENT_URI_DATABASE_READY = Uri.withAppendedPath(BASE_CONTENT_URI, + CONTENT_PATH_DATABASE_READY); - public static final String CONTENT_PATH_NULL = "null_content"; - - public static final String CONTENT_PATH_DATABASE_READY = "database_ready"; - - public static final Uri BASE_CONTENT_URI = new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT) - .authority(AUTHORITY).build(); - - public static final Uri CONTENT_URI_NULL = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH_NULL); - - public static final Uri CONTENT_URI_DATABASE_READY = Uri.withAppendedPath(BASE_CONTENT_URI, - CONTENT_PATH_DATABASE_READY); + public static final Uri[] STATUSES_URIS = new Uri[]{Statuses.CONTENT_URI, Mentions.CONTENT_URI, + CachedStatuses.CONTENT_URI}; + public static final Uri[] CACHE_URIS = new Uri[]{CachedUsers.CONTENT_URI, CachedStatuses.CONTENT_URI, + CachedHashtags.CONTENT_URI, CachedTrends.Local.CONTENT_URI}; + public static final Uri[] DIRECT_MESSAGES_URIS = new Uri[]{DirectMessages.Inbox.CONTENT_URI, + DirectMessages.Outbox.CONTENT_URI}; - public static final Uri[] STATUSES_URIS = new Uri[] { Statuses.CONTENT_URI, Mentions.CONTENT_URI, - CachedStatuses.CONTENT_URI }; - public static final Uri[] CACHE_URIS = new Uri[] { CachedUsers.CONTENT_URI, CachedStatuses.CONTENT_URI, - CachedHashtags.CONTENT_URI, CachedTrends.Local.CONTENT_URI }; - public static final Uri[] DIRECT_MESSAGES_URIS = new Uri[] { DirectMessages.Inbox.CONTENT_URI, - DirectMessages.Outbox.CONTENT_URI }; + public static interface Accounts extends BaseColumns { - public static interface Accounts extends BaseColumns { + public static final int AUTH_TYPE_OAUTH = 0; + public static final int AUTH_TYPE_XAUTH = 1; + public static final int AUTH_TYPE_BASIC = 2; + public static final int AUTH_TYPE_TWIP_O_MODE = 3; - public static final int AUTH_TYPE_OAUTH = 0; - public static final int AUTH_TYPE_XAUTH = 1; - public static final int AUTH_TYPE_BASIC = 2; - public static final int AUTH_TYPE_TWIP_O_MODE = 3; + public static final String TABLE_NAME = "accounts"; + public static final String CONTENT_PATH = TABLE_NAME; + public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - public static final String TABLE_NAME = "accounts"; - public static final String CONTENT_PATH = TABLE_NAME; - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + /** + * Login name of the account
+ * Type: TEXT NOT NULL + */ + public static final String SCREEN_NAME = "screen_name"; - /** - * Login name of the account
- * Type: TEXT NOT NULL - */ - public static final String SCREEN_NAME = "screen_name"; + public static final String NAME = "name"; - public static final String NAME = "name"; + /** + * Unique ID of the account
+ * Type: INTEGER (long) + */ + public static final String ACCOUNT_ID = "account_id"; - /** - * Unique ID of the account
- * Type: INTEGER (long) - */ - public static final String ACCOUNT_ID = "account_id"; + /** + * Auth type of the account.
Type: INTEGER + */ + public static final String AUTH_TYPE = "auth_type"; - /** - * Auth type of the account.
Type: INTEGER - */ - public static final String AUTH_TYPE = "auth_type"; + /** + * Password of the account. (It will not stored)
+ * Type: TEXT + */ + public static final String PASSWORD = "password"; - /** - * Password of the account. (It will not stored)
- * Type: TEXT - */ - public static final String PASSWORD = "password"; + public static final String BASIC_AUTH_USERNAME = "basic_auth_username"; - public static final String BASIC_AUTH_USERNAME = "basic_auth_username"; + /** + * Password of the account for basic auth.
+ * Type: TEXT + */ + public static final String BASIC_AUTH_PASSWORD = "basic_auth_password"; - /** - * Password of the account for basic auth.
- * Type: TEXT - */ - public static final String BASIC_AUTH_PASSWORD = "basic_auth_password"; + /** + * OAuth Token of the account.
+ * Type: TEXT + */ + public static final String OAUTH_TOKEN = "oauth_token"; - /** - * OAuth Token of the account.
- * Type: TEXT - */ - public static final String OAUTH_TOKEN = "oauth_token"; + /** + * Token Secret of the account.
+ * Type: TEXT + */ + public static final String OAUTH_TOKEN_SECRET = "oauth_token_secret"; - /** - * Token Secret of the account.
- * Type: TEXT - */ - public static final String OAUTH_TOKEN_SECRET = "oauth_token_secret"; + public static final String COLOR = "color"; - public static final String COLOR = "color"; + /** + * Set to a non-zero integer if the account is activated.
+ * Type: INTEGER (boolean) + */ + public static final String IS_ACTIVATED = "is_activated"; - /** - * Set to a non-zero integer if the account is activated.
- * Type: INTEGER (boolean) - */ - public static final String IS_ACTIVATED = "is_activated"; + public static final String CONSUMER_KEY = "consumer_key"; - public static final String CONSUMER_KEY = "consumer_key"; + public static final String CONSUMER_SECRET = "consumer_secret"; - public static final String CONSUMER_SECRET = "consumer_secret"; + /** + * User's profile image URL of the status.
+ * Type: TEXT + */ + public static final String PROFILE_IMAGE_URL = "profile_image_url"; - /** - * User's profile image URL of the status.
- * Type: TEXT - */ - public static final String PROFILE_IMAGE_URL = "profile_image_url"; + public static final String PROFILE_BANNER_URL = "profile_banner_url"; + public static final String API_URL_FORMAT = "api_url_format"; + public static final String SAME_OAUTH_SIGNING_URL = "same_oauth_signing_url"; + public static final String NO_VERSION_SUFFIX = "no_version_suffix"; - public static final String PROFILE_BANNER_URL = "profile_banner_url"; - public static final String API_URL_FORMAT = "api_url_format"; - public static final String SAME_OAUTH_SIGNING_URL = "same_oauth_signing_url"; + public static final String[] COLUMNS_NO_CREDENTIALS = new String[]{_ID, NAME, SCREEN_NAME, ACCOUNT_ID, + PROFILE_IMAGE_URL, PROFILE_BANNER_URL, COLOR, IS_ACTIVATED}; - public static final String[] COLUMNS_NO_CREDENTIALS = new String[] { _ID, NAME, SCREEN_NAME, ACCOUNT_ID, - PROFILE_IMAGE_URL, PROFILE_BANNER_URL, COLOR, IS_ACTIVATED }; + public static final String[] COLUMNS = new String[]{_ID, NAME, SCREEN_NAME, ACCOUNT_ID, AUTH_TYPE, + BASIC_AUTH_USERNAME, BASIC_AUTH_PASSWORD, OAUTH_TOKEN, OAUTH_TOKEN_SECRET, CONSUMER_KEY, + CONSUMER_SECRET, API_URL_FORMAT, SAME_OAUTH_SIGNING_URL, NO_VERSION_SUFFIX, PROFILE_IMAGE_URL, PROFILE_BANNER_URL, COLOR, + IS_ACTIVATED}; - public static final String[] COLUMNS = new String[] { _ID, NAME, SCREEN_NAME, ACCOUNT_ID, AUTH_TYPE, - BASIC_AUTH_USERNAME, BASIC_AUTH_PASSWORD, OAUTH_TOKEN, OAUTH_TOKEN_SECRET, CONSUMER_KEY, - CONSUMER_SECRET, API_URL_FORMAT, SAME_OAUTH_SIGNING_URL, PROFILE_IMAGE_URL, PROFILE_BANNER_URL, COLOR, - IS_ACTIVATED }; + public static final String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_TEXT_NOT_NULL, TYPE_TEXT_NOT_NULL, + TYPE_INT_UNIQUE, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, + TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_TEXT, TYPE_TEXT, TYPE_INT, TYPE_BOOLEAN}; - public static final String[] TYPES = new String[] { TYPE_PRIMARY_KEY, TYPE_TEXT_NOT_NULL, TYPE_TEXT_NOT_NULL, - TYPE_INT_UNIQUE, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, - TYPE_BOOLEAN, TYPE_TEXT, TYPE_TEXT, TYPE_INT, TYPE_BOOLEAN }; + } - } + public static interface CachedHashtags extends CachedValues { - public static interface CachedHashtags extends CachedValues { + public static final String[] COLUMNS = new String[]{_ID, NAME}; + public static final String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_TEXT}; - public static final String[] COLUMNS = new String[] { _ID, NAME }; - public static final String[] TYPES = new String[] { TYPE_PRIMARY_KEY, TYPE_TEXT }; + public static final String TABLE_NAME = "cached_hashtags"; + public static final String CONTENT_PATH = TABLE_NAME; - public static final String TABLE_NAME = "cached_hashtags"; - public static final String CONTENT_PATH = TABLE_NAME; + public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + } - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - } + public static interface CachedImages extends BaseColumns { + public static final String TABLE_NAME = "cached_images"; + public static final String CONTENT_PATH = TABLE_NAME; - public static interface CachedImages extends BaseColumns { - public static final String TABLE_NAME = "cached_images"; - public static final String CONTENT_PATH = TABLE_NAME; + public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + public static final String URL = "url"; - public static final String URL = "url"; + public static final String PATH = "path"; - public static final String PATH = "path"; + public static final String[] MATRIX_COLUMNS = new String[]{URL, PATH}; - public static final String[] MATRIX_COLUMNS = new String[] { URL, PATH }; + public static final String[] COLUMNS = new String[]{_ID, URL, PATH}; + } - public static final String[] COLUMNS = new String[] { _ID, URL, PATH }; - } + public static interface CachedStatuses extends Statuses { + public static final String TABLE_NAME = "cached_statuses"; + public static final String CONTENT_PATH = TABLE_NAME; - public static interface CachedStatuses extends Statuses { - public static final String TABLE_NAME = "cached_statuses"; - public static final String CONTENT_PATH = TABLE_NAME; + public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + } - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - } + public static interface CachedTrends extends CachedValues { - public static interface CachedTrends extends CachedValues { + public static final String TIMESTAMP = "timestamp"; - public static final String TIMESTAMP = "timestamp"; + public static final String[] COLUMNS = new String[]{_ID, NAME, TIMESTAMP}; + public static final String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_TEXT, TYPE_INT}; - public static final String[] COLUMNS = new String[] { _ID, NAME, TIMESTAMP }; - public static final String[] TYPES = new String[] { TYPE_PRIMARY_KEY, TYPE_TEXT, TYPE_INT }; + public static interface Local extends CachedTrends { + public static final String TABLE_NAME = "local_trends"; + public static final String CONTENT_PATH = TABLE_NAME; - public static interface Local extends CachedTrends { - public static final String TABLE_NAME = "local_trends"; - public static final String CONTENT_PATH = TABLE_NAME; + public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + } - } + } - } + public static interface CachedUsers extends CachedValues { - public static interface CachedUsers extends CachedValues { + public static final String TABLE_NAME = "cached_users"; + public static final String CONTENT_PATH = TABLE_NAME; - public static final String TABLE_NAME = "cached_users"; - public static final String CONTENT_PATH = TABLE_NAME; + public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + public static final String USER_ID = "user_id"; - public static final String USER_ID = "user_id"; + public static final String CREATED_AT = "created_at"; - public static final String CREATED_AT = "created_at"; + public static final String IS_PROTECTED = "is_protected"; - public static final String IS_PROTECTED = "is_protected"; + public static final String IS_VERIFIED = "is_verified"; - public static final String IS_VERIFIED = "is_verified"; + public static final String IS_FOLLOWING = "is_following"; - public static final String IS_FOLLOWING = "is_following"; + public static final String DESCRIPTION_PLAIN = "description_plain"; - public static final String DESCRIPTION_PLAIN = "description_plain"; + public static final String DESCRIPTION_HTML = "description_html"; - public static final String DESCRIPTION_HTML = "description_html"; + public static final String DESCRIPTION_EXPANDED = "description_expanded"; - public static final String DESCRIPTION_EXPANDED = "description_expanded"; + public static final String LOCATION = "location"; - public static final String LOCATION = "location"; + public static final String URL = "url"; - public static final String URL = "url"; + public static final String URL_EXPANDED = "url_expanded"; - public static final String URL_EXPANDED = "url_expanded"; + public static final String PROFILE_BANNER_URL = "profile_banner_url"; - public static final String PROFILE_BANNER_URL = "profile_banner_url"; + public static final String FOLLOWERS_COUNT = "followers_count"; - public static final String FOLLOWERS_COUNT = "followers_count"; + public static final String FRIENDS_COUNT = "friends_count"; - public static final String FRIENDS_COUNT = "friends_count"; + public static final String STATUSES_COUNT = "statuses_count"; - public static final String STATUSES_COUNT = "statuses_count"; + public static final String FAVORITES_COUNT = "favorites_count"; - public static final String FAVORITES_COUNT = "favorites_count"; + /** + * User's screen name of the status.
+ * Type: TEXT + */ + public static final String SCREEN_NAME = "screen_name"; - /** - * User's screen name of the status.
- * Type: TEXT - */ - public static final String SCREEN_NAME = "screen_name"; + /** + * User's profile image URL of the status.
+ * Type: TEXT NOT NULL + */ + public static final String PROFILE_IMAGE_URL = "profile_image_url"; - /** - * User's profile image URL of the status.
- * Type: TEXT NOT NULL - */ - public static final String PROFILE_IMAGE_URL = "profile_image_url"; + public static final String[] COLUMNS = new String[]{_ID, USER_ID, CREATED_AT, NAME, SCREEN_NAME, + DESCRIPTION_PLAIN, LOCATION, URL, PROFILE_IMAGE_URL, PROFILE_BANNER_URL, IS_PROTECTED, IS_VERIFIED, + IS_FOLLOWING, FOLLOWERS_COUNT, FRIENDS_COUNT, STATUSES_COUNT, FAVORITES_COUNT, DESCRIPTION_HTML, + DESCRIPTION_EXPANDED, URL_EXPANDED}; - public static final String[] COLUMNS = new String[] { _ID, USER_ID, CREATED_AT, NAME, SCREEN_NAME, - DESCRIPTION_PLAIN, LOCATION, URL, PROFILE_IMAGE_URL, PROFILE_BANNER_URL, IS_PROTECTED, IS_VERIFIED, - IS_FOLLOWING, FOLLOWERS_COUNT, FRIENDS_COUNT, STATUSES_COUNT, FAVORITES_COUNT, DESCRIPTION_HTML, - DESCRIPTION_EXPANDED, URL_EXPANDED }; + public static final String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_INT_UNIQUE, TYPE_INT, TYPE_TEXT, + TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_BOOLEAN, TYPE_BOOLEAN, + TYPE_BOOLEAN, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT}; - public static final String[] TYPES = new String[] { TYPE_PRIMARY_KEY, TYPE_INT_UNIQUE, TYPE_INT, TYPE_TEXT, - TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_BOOLEAN, TYPE_BOOLEAN, - TYPE_BOOLEAN, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT }; + } - } + public static interface CachedValues extends BaseColumns { - public static interface CachedValues extends BaseColumns { + public static final String NAME = "name"; + } - public static final String NAME = "name"; - } + public static interface CacheFiles extends BaseColumns { + public static final String TABLE_NAME = "cache_files"; + public static final String CONTENT_PATH = TABLE_NAME; - public static interface CacheFiles extends BaseColumns { - public static final String TABLE_NAME = "cache_files"; - public static final String CONTENT_PATH = TABLE_NAME; + public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + public static final String NAME = "name"; - public static final String NAME = "name"; + public static final String PATH = "path"; - public static final String PATH = "path"; + public static final String[] MATRIX_COLUMNS = new String[]{NAME, PATH}; - public static final String[] MATRIX_COLUMNS = new String[] { NAME, PATH }; + public static final String[] COLUMNS = new String[]{_ID, NAME, PATH}; + } - public static final String[] COLUMNS = new String[] { _ID, NAME, PATH }; - } + public static interface DirectMessages extends BaseColumns { - public static interface DirectMessages extends BaseColumns { + public static final String TABLE_NAME = "messages"; + public static final String CONTENT_PATH = TABLE_NAME; - public static final String TABLE_NAME = "messages"; - public static final String CONTENT_PATH = TABLE_NAME; + public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + public static final String ACCOUNT_ID = "account_id"; + public static final String MESSAGE_ID = "message_id"; + public static final String MESSAGE_TIMESTAMP = "message_timestamp"; + public static final String SENDER_ID = "sender_id"; + public static final String RECIPIENT_ID = "recipient_id"; - public static final String ACCOUNT_ID = "account_id"; - public static final String MESSAGE_ID = "message_id"; - public static final String MESSAGE_TIMESTAMP = "message_timestamp"; - public static final String SENDER_ID = "sender_id"; - public static final String RECIPIENT_ID = "recipient_id"; + public static final String IS_OUTGOING = "is_outgoing"; - public static final String IS_OUTGOING = "is_outgoing"; + public static final String TEXT_HTML = "text_html"; + public static final String TEXT_PLAIN = "text_plain"; + public static final String TEXT_UNESCAPED = "text_unescaped"; + public static final String SENDER_NAME = "sender_name"; + public static final String RECIPIENT_NAME = "recipient_name"; + public static final String SENDER_SCREEN_NAME = "sender_screen_name"; + public static final String RECIPIENT_SCREEN_NAME = "recipient_screen_name"; + public static final String SENDER_PROFILE_IMAGE_URL = "sender_profile_image_url"; + public static final String RECIPIENT_PROFILE_IMAGE_URL = "recipient_profile_image_url"; - public static final String TEXT_HTML = "text_html"; - public static final String TEXT_PLAIN = "text_plain"; - public static final String TEXT_UNESCAPED = "text_unescaped"; - public static final String SENDER_NAME = "sender_name"; - public static final String RECIPIENT_NAME = "recipient_name"; - public static final String SENDER_SCREEN_NAME = "sender_screen_name"; - public static final String RECIPIENT_SCREEN_NAME = "recipient_screen_name"; - public static final String SENDER_PROFILE_IMAGE_URL = "sender_profile_image_url"; - public static final String RECIPIENT_PROFILE_IMAGE_URL = "recipient_profile_image_url"; + public static final String MEDIAS = "medias"; - public static final String MEDIAS = "medias"; + public static final String FIRST_MEDIA = "first_media"; - public static final String FIRST_MEDIA = "first_media"; + public static final String[] COLUMNS = new String[]{_ID, ACCOUNT_ID, MESSAGE_ID, MESSAGE_TIMESTAMP, + SENDER_ID, RECIPIENT_ID, IS_OUTGOING, TEXT_HTML, TEXT_PLAIN, TEXT_UNESCAPED, SENDER_NAME, + RECIPIENT_NAME, SENDER_SCREEN_NAME, RECIPIENT_SCREEN_NAME, SENDER_PROFILE_IMAGE_URL, + RECIPIENT_PROFILE_IMAGE_URL, MEDIAS, FIRST_MEDIA}; + public static final String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, + TYPE_INT, TYPE_BOOLEAN, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, + TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT}; - public static final String[] COLUMNS = new String[] { _ID, ACCOUNT_ID, MESSAGE_ID, MESSAGE_TIMESTAMP, - SENDER_ID, RECIPIENT_ID, IS_OUTGOING, TEXT_HTML, TEXT_PLAIN, TEXT_UNESCAPED, SENDER_NAME, - RECIPIENT_NAME, SENDER_SCREEN_NAME, RECIPIENT_SCREEN_NAME, SENDER_PROFILE_IMAGE_URL, - RECIPIENT_PROFILE_IMAGE_URL, MEDIAS, FIRST_MEDIA }; - public static final String[] TYPES = new String[] { TYPE_PRIMARY_KEY, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, - TYPE_INT, TYPE_BOOLEAN, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, - TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT }; + public static final String DEFAULT_SORT_ORDER = MESSAGE_ID + " DESC"; - public static final String DEFAULT_SORT_ORDER = MESSAGE_ID + " DESC"; + public static interface Conversation extends DirectMessages { - public static interface Conversation extends DirectMessages { + public static final String DEFAULT_SORT_ORDER = MESSAGE_TIMESTAMP + " ASC"; - public static final String DEFAULT_SORT_ORDER = MESSAGE_TIMESTAMP + " ASC"; + public static final String CONTENT_PATH_SEGMENT = "conversation"; + public static final String CONTENT_PATH_SEGMENT_SCREEN_NAME = "conversation_screen_name"; - public static final String CONTENT_PATH_SEGMENT = "conversation"; - public static final String CONTENT_PATH_SEGMENT_SCREEN_NAME = "conversation_screen_name"; + public static final String CONTENT_PATH = DirectMessages.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; + public static final String CONTENT_PATH_SCREEN_NAME = DirectMessages.CONTENT_PATH + "/" + + CONTENT_PATH_SEGMENT_SCREEN_NAME; - public static final String CONTENT_PATH = DirectMessages.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; - public static final String CONTENT_PATH_SCREEN_NAME = DirectMessages.CONTENT_PATH + "/" - + CONTENT_PATH_SEGMENT_SCREEN_NAME; + public static final Uri CONTENT_URI = Uri + .withAppendedPath(DirectMessages.CONTENT_URI, CONTENT_PATH_SEGMENT); - public static final Uri CONTENT_URI = Uri - .withAppendedPath(DirectMessages.CONTENT_URI, CONTENT_PATH_SEGMENT); + public static final Uri CONTENT_URI_SCREEN_NAME = Uri.withAppendedPath(DirectMessages.CONTENT_URI, + CONTENT_PATH_SEGMENT_SCREEN_NAME); + } - public static final Uri CONTENT_URI_SCREEN_NAME = Uri.withAppendedPath(DirectMessages.CONTENT_URI, - CONTENT_PATH_SEGMENT_SCREEN_NAME); - } + public static interface ConversationEntries extends BaseColumns { - public static interface ConversationEntries extends BaseColumns { + public static final String TABLE_NAME = "messages_conversation_entries"; - public static final String TABLE_NAME = "messages_conversation_entries"; + public static final String CONTENT_PATH_SEGMENT = "conversation_entries"; + public static final String CONTENT_PATH = DirectMessages.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; - public static final String CONTENT_PATH_SEGMENT = "conversation_entries"; - public static final String CONTENT_PATH = DirectMessages.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; + public static final Uri CONTENT_URI = Uri + .withAppendedPath(DirectMessages.CONTENT_URI, CONTENT_PATH_SEGMENT); - public static final Uri CONTENT_URI = Uri - .withAppendedPath(DirectMessages.CONTENT_URI, CONTENT_PATH_SEGMENT); + public static final String MESSAGE_TIMESTAMP = "message_timestamp"; + public static final String NAME = "name"; + public static final String SCREEN_NAME = "screen_name"; + public static final String PROFILE_IMAGE_URL = "profile_image_url"; + public static final String TEXT_HTML = "text_html"; + public static final String CONVERSATION_ID = "conversation_id"; - public static final String MESSAGE_TIMESTAMP = "message_timestamp"; - public static final String NAME = "name"; - public static final String SCREEN_NAME = "screen_name"; - public static final String PROFILE_IMAGE_URL = "profile_image_url"; - public static final String TEXT_HTML = "text_html"; - public static final String CONVERSATION_ID = "conversation_id"; + public static final int IDX__ID = 0; + public static final int IDX_MESSAGE_TIMESTAMP = 1; + public static final int IDX_MESSAGE_ID = 2; + public static final int IDX_ACCOUNT_ID = 3; + public static final int IDX_IS_OUTGOING = 4; + public static final int IDX_NAME = 5; + public static final int IDX_SCREEN_NAME = 6; + public static final int IDX_PROFILE_IMAGE_URL = 7; + public static final int IDX_TEXT = 8; + public static final int IDX_CONVERSATION_ID = 9; + } - public static final int IDX__ID = 0; - public static final int IDX_MESSAGE_TIMESTAMP = 1; - public static final int IDX_MESSAGE_ID = 2; - public static final int IDX_ACCOUNT_ID = 3; - public static final int IDX_IS_OUTGOING = 4; - public static final int IDX_NAME = 5; - public static final int IDX_SCREEN_NAME = 6; - public static final int IDX_PROFILE_IMAGE_URL = 7; - public static final int IDX_TEXT = 8; - public static final int IDX_CONVERSATION_ID = 9; - } + public static interface Inbox extends DirectMessages { - public static interface Inbox extends DirectMessages { + public static final String TABLE_NAME = "messages_inbox"; - public static final String TABLE_NAME = "messages_inbox"; + public static final String CONTENT_PATH_SEGMENT = "inbox"; + public static final String CONTENT_PATH = DirectMessages.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; - public static final String CONTENT_PATH_SEGMENT = "inbox"; - public static final String CONTENT_PATH = DirectMessages.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; + public static final Uri CONTENT_URI = Uri + .withAppendedPath(DirectMessages.CONTENT_URI, CONTENT_PATH_SEGMENT); - public static final Uri CONTENT_URI = Uri - .withAppendedPath(DirectMessages.CONTENT_URI, CONTENT_PATH_SEGMENT); + } - } + public static interface Outbox extends DirectMessages { - public static interface Outbox extends DirectMessages { + public static final String TABLE_NAME = "messages_outbox"; - public static final String TABLE_NAME = "messages_outbox"; + public static final String CONTENT_PATH_SEGMENT = "outbox"; + public static final String CONTENT_PATH = DirectMessages.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; - public static final String CONTENT_PATH_SEGMENT = "outbox"; - public static final String CONTENT_PATH = DirectMessages.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; + public static final Uri CONTENT_URI = Uri + .withAppendedPath(DirectMessages.CONTENT_URI, CONTENT_PATH_SEGMENT); - public static final Uri CONTENT_URI = Uri - .withAppendedPath(DirectMessages.CONTENT_URI, CONTENT_PATH_SEGMENT); + } - } + } - } + public static interface DNS extends BaseColumns { + public static final String TABLE_NAME = "dns"; + public static final String CONTENT_PATH = TABLE_NAME; - public static interface DNS extends BaseColumns { - public static final String TABLE_NAME = "dns"; - public static final String CONTENT_PATH = TABLE_NAME; + public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + public static final String HOST = "host"; - public static final String HOST = "host"; + public static final String ADDRESS = "address"; - public static final String ADDRESS = "address"; + public static final String[] MATRIX_COLUMNS = new String[]{HOST, ADDRESS}; - public static final String[] MATRIX_COLUMNS = new String[] { HOST, ADDRESS }; + public static final String[] COLUMNS = new String[]{_ID, HOST, ADDRESS}; + } - public static final String[] COLUMNS = new String[] { _ID, HOST, ADDRESS }; - } + public static interface Drafts extends BaseColumns { - public static interface Drafts extends BaseColumns { + public static final int ACTION_UPDATE_STATUS = 1; + public static final int ACTION_SEND_DIRECT_MESSAGE = 2; + public static final int ACTION_CREATE_FRIENDSHIP = 3; - public static final int ACTION_UPDATE_STATUS = 1; - public static final int ACTION_SEND_DIRECT_MESSAGE = 2; - public static final int ACTION_CREATE_FRIENDSHIP = 3; + public static final String TABLE_NAME = "drafts"; + public static final String CONTENT_PATH = TABLE_NAME; - public static final String TABLE_NAME = "drafts"; - public static final String CONTENT_PATH = TABLE_NAME; + public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + /** + * Status content.
+ * Type: TEXT + */ + public static final String TEXT = "text"; - /** - * Status content.
- * Type: TEXT - */ - public static final String TEXT = "text"; + /** + * Account IDs of unsent status.
+ * Type: TEXT + */ + public static final String ACCOUNT_IDS = "account_ids"; - /** - * Account IDs of unsent status.
- * Type: TEXT - */ - public static final String ACCOUNT_IDS = "account_ids"; + public static final String LOCATION = "location"; - public static final String LOCATION = "location"; + public static final String IN_REPLY_TO_STATUS_ID = "in_reply_to_status_id"; - public static final String IN_REPLY_TO_STATUS_ID = "in_reply_to_status_id"; + public static final String MEDIAS = "medias"; - public static final String MEDIAS = "medias"; + public static final String IS_POSSIBLY_SENSITIVE = "is_possibly_sensitive"; - public static final String IS_POSSIBLY_SENSITIVE = "is_possibly_sensitive"; + public static final String TIMESTAMP = "timestamp"; - public static final String TIMESTAMP = "timestamp"; + public static final String ACTION_TYPE = "action_type"; - public static final String ACTION_TYPE = "action_type"; + public static final String ACTION_EXTRAS = "action_extras"; - public static final String ACTION_EXTRAS = "action_extras"; + public static final String[] COLUMNS = new String[]{_ID, TEXT, ACCOUNT_IDS, LOCATION, MEDIAS, + IN_REPLY_TO_STATUS_ID, IS_POSSIBLY_SENSITIVE, TIMESTAMP, ACTION_TYPE, ACTION_EXTRAS}; - public static final String[] COLUMNS = new String[] { _ID, TEXT, ACCOUNT_IDS, LOCATION, MEDIAS, - IN_REPLY_TO_STATUS_ID, IS_POSSIBLY_SENSITIVE, TIMESTAMP, ACTION_TYPE, ACTION_EXTRAS }; + public static final String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, + TYPE_INT, TYPE_INT, TYPE_BOOLEAN, TYPE_INT, TYPE_INT, TYPE_TEXT}; - public static final String[] TYPES = new String[] { TYPE_PRIMARY_KEY, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, - TYPE_INT, TYPE_INT, TYPE_BOOLEAN, TYPE_INT, TYPE_INT, TYPE_TEXT }; + } - } + public static interface Filters extends BaseColumns { - public static interface Filters extends BaseColumns { + public static final String CONTENT_PATH = "filters"; - public static final String CONTENT_PATH = "filters"; + public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + public static final String VALUE = "value"; - public static final String VALUE = "value"; + public static final String ENABLE_IN_HOME_TIMELINE = "enable_in_home_timeline"; - public static final String ENABLE_IN_HOME_TIMELINE = "enable_in_home_timeline"; + public static final String ENABLE_IN_MENTIONS = "enable_in_mentions"; - public static final String ENABLE_IN_MENTIONS = "enable_in_mentions"; + public static final String ENABLE_FOR_RETWEETS = "enable_for_retweets"; - public static final String ENABLE_FOR_RETWEETS = "enable_for_retweets"; + public static final String[] COLUMNS = new String[]{_ID, VALUE}; - public static final String[] COLUMNS = new String[] { _ID, VALUE }; + public static final String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_TEXT_NOT_NULL_UNIQUE}; - public static final String[] TYPES = new String[] { TYPE_PRIMARY_KEY, TYPE_TEXT_NOT_NULL_UNIQUE }; + public static interface Keywords extends Filters { - public static interface Keywords extends Filters { + public static final String TABLE_NAME = "filtered_keywords"; + public static final String CONTENT_PATH_SEGMENT = "keywords"; + public static final String CONTENT_PATH = Filters.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; + public static final Uri CONTENT_URI = Uri.withAppendedPath(Filters.CONTENT_URI, CONTENT_PATH_SEGMENT); + } - public static final String TABLE_NAME = "filtered_keywords"; - public static final String CONTENT_PATH_SEGMENT = "keywords"; - public static final String CONTENT_PATH = Filters.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; - public static final Uri CONTENT_URI = Uri.withAppendedPath(Filters.CONTENT_URI, CONTENT_PATH_SEGMENT); - } + public static interface Links extends Filters { - public static interface Links extends Filters { + public static final String TABLE_NAME = "filtered_links"; + public static final String CONTENT_PATH_SEGMENT = "links"; + public static final String CONTENT_PATH = Filters.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; + public static final Uri CONTENT_URI = Uri.withAppendedPath(Filters.CONTENT_URI, CONTENT_PATH_SEGMENT); + } - public static final String TABLE_NAME = "filtered_links"; - public static final String CONTENT_PATH_SEGMENT = "links"; - public static final String CONTENT_PATH = Filters.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; - public static final Uri CONTENT_URI = Uri.withAppendedPath(Filters.CONTENT_URI, CONTENT_PATH_SEGMENT); - } + public static interface Sources extends Filters { - public static interface Sources extends Filters { + public static final String TABLE_NAME = "filtered_sources"; + public static final String CONTENT_PATH_SEGMENT = "sources"; + public static final String CONTENT_PATH = Filters.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; + public static final Uri CONTENT_URI = Uri.withAppendedPath(Filters.CONTENT_URI, CONTENT_PATH_SEGMENT); + } - public static final String TABLE_NAME = "filtered_sources"; - public static final String CONTENT_PATH_SEGMENT = "sources"; - public static final String CONTENT_PATH = Filters.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; - public static final Uri CONTENT_URI = Uri.withAppendedPath(Filters.CONTENT_URI, CONTENT_PATH_SEGMENT); - } + public static interface Users extends BaseColumns { - public static interface Users extends BaseColumns { + public static final String TABLE_NAME = "filtered_users"; + public static final String CONTENT_PATH_SEGMENT = "users"; + public static final String CONTENT_PATH = Filters.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; + public static final Uri CONTENT_URI = Uri.withAppendedPath(Filters.CONTENT_URI, CONTENT_PATH_SEGMENT); - public static final String TABLE_NAME = "filtered_users"; - public static final String CONTENT_PATH_SEGMENT = "users"; - public static final String CONTENT_PATH = Filters.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; - public static final Uri CONTENT_URI = Uri.withAppendedPath(Filters.CONTENT_URI, CONTENT_PATH_SEGMENT); + public static final String USER_ID = "user_id"; + public static final String NAME = "name"; + public static final String SCREEN_NAME = "screen_name"; - public static final String USER_ID = "user_id"; - public static final String NAME = "name"; - public static final String SCREEN_NAME = "screen_name"; + public static final String[] COLUMNS = new String[]{_ID, USER_ID, NAME, SCREEN_NAME}; - public static final String[] COLUMNS = new String[] { _ID, USER_ID, NAME, SCREEN_NAME }; + public static final String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_INT_UNIQUE, TYPE_TEXT_NOT_NULL, + TYPE_TEXT_NOT_NULL}; + } + } - public static final String[] TYPES = new String[] { TYPE_PRIMARY_KEY, TYPE_INT_UNIQUE, TYPE_TEXT_NOT_NULL, - TYPE_TEXT_NOT_NULL }; - } - } + public static interface Mentions extends Statuses { - public static interface Mentions extends Statuses { + public static final String TABLE_NAME = "mentions"; + public static final String CONTENT_PATH = TABLE_NAME; - public static final String TABLE_NAME = "mentions"; - public static final String CONTENT_PATH = TABLE_NAME; + public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + } - } + public static interface Notifications extends BaseColumns { - public static interface Notifications extends BaseColumns { + public static final String TABLE_NAME = "notifications"; - public static final String TABLE_NAME = "notifications"; + public static final String CONTENT_PATH = TABLE_NAME; - public static final String CONTENT_PATH = TABLE_NAME; + public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + public static final String ID = "id"; - public static final String ID = "id"; + public static final String COUNT = "count"; - public static final String COUNT = "count"; + public static final String[] MATRIX_COLUMNS = new String[]{ID, COUNT}; - public static final String[] MATRIX_COLUMNS = new String[] { ID, COUNT }; + public static final String[] COLUMNS = new String[]{_ID, ID, COUNT}; + } - public static final String[] COLUMNS = new String[] { _ID, ID, COUNT }; - } + public static interface Permissions extends BaseColumns { + public static final String TABLE_NAME = "permissions"; + public static final String CONTENT_PATH = TABLE_NAME; - public static interface Permissions extends BaseColumns { - public static final String TABLE_NAME = "permissions"; - public static final String CONTENT_PATH = TABLE_NAME; + public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + public static final String PERMISSION = "permissions"; - public static final String PERMISSION = "permissions"; + public static final String PACKAGE_NAME = "package_name"; - public static final String PACKAGE_NAME = "package_name"; + public static final String[] MATRIX_COLUMNS = new String[]{PACKAGE_NAME, PERMISSION}; - public static final String[] MATRIX_COLUMNS = new String[] { PACKAGE_NAME, PERMISSION }; + public static final String[] COLUMNS = new String[]{_ID, PACKAGE_NAME, PERMISSION}; + } - public static final String[] COLUMNS = new String[] { _ID, PACKAGE_NAME, PERMISSION }; - } + public static interface Preferences extends BaseColumns { + public static final String TABLE_NAME = "preferences"; + public static final String CONTENT_PATH = TABLE_NAME; - public static interface Preferences extends BaseColumns { - public static final String TABLE_NAME = "preferences"; - public static final String CONTENT_PATH = TABLE_NAME; + public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + public static final int TYPE_INVALID = -1; - public static final int TYPE_INVALID = -1; + public static final int TYPE_NULL = 0; - public static final int TYPE_NULL = 0; + public static final int TYPE_BOOLEAN = 1; - public static final int TYPE_BOOLEAN = 1; + public static final int TYPE_INTEGER = 2; - public static final int TYPE_INTEGER = 2; + public static final int TYPE_LONG = 3; - public static final int TYPE_LONG = 3; + public static final int TYPE_FLOAT = 4; - public static final int TYPE_FLOAT = 4; + public static final int TYPE_STRING = 5; - public static final int TYPE_STRING = 5; + public static final String KEY = "key"; - public static final String KEY = "key"; + public static final String VALUE = "value"; - public static final String VALUE = "value"; + public static final String TYPE = "type"; - public static final String TYPE = "type"; + public static final String[] MATRIX_COLUMNS = new String[]{KEY, VALUE, TYPE}; - public static final String[] MATRIX_COLUMNS = new String[] { KEY, VALUE, TYPE }; + public static final String[] COLUMNS = new String[]{_ID, KEY, VALUE, TYPE}; + } - public static final String[] COLUMNS = new String[] { _ID, KEY, VALUE, TYPE }; - } + public static interface Statuses extends BaseColumns { - public static interface Statuses extends BaseColumns { + public static final String TABLE_NAME = "statuses"; + public static final String CONTENT_PATH = TABLE_NAME; - public static final String TABLE_NAME = "statuses"; - public static final String CONTENT_PATH = TABLE_NAME; + public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + /** + * Account ID of the status.
+ * Type: TEXT + */ + public static final String ACCOUNT_ID = "account_id"; - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - /** - * Account ID of the status.
- * Type: TEXT - */ - public static final String ACCOUNT_ID = "account_id"; + /** + * Status content, in HTML. Please note, this is not actually original + * text.
+ * Type: TEXT + */ + public static final String TEXT_HTML = "text_html"; - /** - * Status content, in HTML. Please note, this is not actually original - * text.
- * Type: TEXT - */ - public static final String TEXT_HTML = "text_html"; + /** + * + */ + public static final String TEXT_PLAIN = "text_plain"; - /** - * - */ - public static final String TEXT_PLAIN = "text_plain"; + public static final String TEXT_UNESCAPED = "text_unescaped"; - public static final String TEXT_UNESCAPED = "text_unescaped"; + /** + * User name of the status.
+ * Type: TEXT + */ + public static final String USER_NAME = "name"; - /** - * User name of the status.
- * Type: TEXT - */ - public static final String USER_NAME = "name"; + /** + * User's screen name of the status.
+ * Type: TEXT + */ + public static final String USER_SCREEN_NAME = "screen_name"; - /** - * User's screen name of the status.
- * Type: TEXT - */ - public static final String USER_SCREEN_NAME = "screen_name"; + /** + * User's profile image URL of the status.
+ * Type: TEXT NOT NULL + */ + public static final String USER_PROFILE_IMAGE_URL = "profile_image_url"; - /** - * User's profile image URL of the status.
- * Type: TEXT NOT NULL - */ - public static final String USER_PROFILE_IMAGE_URL = "profile_image_url"; + /** + * Unique id of the status.
+ * Type: INTEGER UNIQUE(long) + */ + public static final String STATUS_ID = "status_id"; - /** - * Unique id of the status.
- * Type: INTEGER UNIQUE(long) - */ - public static final String STATUS_ID = "status_id"; + /** + * Retweet count of the status.
+ * Type: INTEGER (long) + */ + public static final String RETWEET_COUNT = "retweet_count"; + public static final String FAVORITE_COUNT = "favorite_count"; - /** - * Retweet count of the status.
- * Type: INTEGER (long) - */ - public static final String RETWEET_COUNT = "retweet_count"; - public static final String FAVORITE_COUNT = "favorite_count"; + /** + * Set to an non-zero integer if the status is a retweet, set to + * negative value if the status is retweeted by user.
+ * Type: INTEGER + */ + public static final String IS_RETWEET = "is_retweet"; - /** - * Set to an non-zero integer if the status is a retweet, set to - * negative value if the status is retweeted by user.
- * Type: INTEGER - */ - public static final String IS_RETWEET = "is_retweet"; + /** + * Set to 1 if the status is a favorite.
+ * Type: INTEGER (boolean) + */ + public static final String IS_FAVORITE = "is_favorite"; - /** - * Set to 1 if the status is a favorite.
- * Type: INTEGER (boolean) - */ - public static final String IS_FAVORITE = "is_favorite"; + public static final String IS_POSSIBLY_SENSITIVE = "is_possibly_sensitive"; - public static final String IS_POSSIBLY_SENSITIVE = "is_possibly_sensitive"; + /** + * Set to 1 if the status is a gap.
+ * Type: INTEGER (boolean) + */ + public static final String IS_GAP = "is_gap"; - /** - * Set to 1 if the status is a gap.
- * Type: INTEGER (boolean) - */ - public static final String IS_GAP = "is_gap"; + public static final String LOCATION = "location"; - public static final String LOCATION = "location"; + /** + * User's ID of the status.
+ * Type: INTEGER (long) + */ + public static final String USER_ID = "user_id"; - /** - * User's ID of the status.
- * Type: INTEGER (long) - */ - public static final String USER_ID = "user_id"; + public static final String IN_REPLY_TO_STATUS_ID = "in_reply_to_status_id"; - public static final String IN_REPLY_TO_STATUS_ID = "in_reply_to_status_id"; + public static final String IN_REPLY_TO_USER_ID = "in_reply_to_user_id"; - public static final String IN_REPLY_TO_USER_ID = "in_reply_to_user_id"; + public static final String IN_REPLY_TO_USER_NAME = "in_reply_to_user_name"; - public static final String IN_REPLY_TO_USER_NAME = "in_reply_to_user_name"; + public static final String IN_REPLY_TO_USER_SCREEN_NAME = "in_reply_to_user_screen_name"; - public static final String IN_REPLY_TO_USER_SCREEN_NAME = "in_reply_to_user_screen_name"; + public static final String SOURCE = "source"; - public static final String SOURCE = "source"; + public static final String IS_PROTECTED = "is_protected"; - public static final String IS_PROTECTED = "is_protected"; + public static final String IS_VERIFIED = "is_verified"; - public static final String IS_VERIFIED = "is_verified"; + public static final String IS_FOLLOWING = "is_following"; - public static final String IS_FOLLOWING = "is_following"; + public static final String RETWEET_ID = "retweet_id"; - public static final String RETWEET_ID = "retweet_id"; + public static final String RETWEET_TIMESTAMP = "retweet_timestamp"; - public static final String RETWEET_TIMESTAMP = "retweet_timestamp"; + public static final String RETWEETED_BY_USER_ID = "retweeted_by_user_id"; - public static final String RETWEETED_BY_USER_ID = "retweeted_by_user_id"; + public static final String RETWEETED_BY_USER_NAME = "retweeted_by_user_name"; - public static final String RETWEETED_BY_USER_NAME = "retweeted_by_user_name"; + public static final String RETWEETED_BY_USER_SCREEN_NAME = "retweeted_by_user_screen_name"; - public static final String RETWEETED_BY_USER_SCREEN_NAME = "retweeted_by_user_screen_name"; + /** + * Timestamp of the status.
+ * Type: INTEGER (long) + */ + public static final String STATUS_TIMESTAMP = "status_timestamp"; - /** - * Timestamp of the status.
- * Type: INTEGER (long) - */ - public static final String STATUS_TIMESTAMP = "status_timestamp"; + public static final String MY_RETWEET_ID = "my_retweet_id"; - public static final String MY_RETWEET_ID = "my_retweet_id"; + public static final String MEDIAS = "medias"; - public static final String MEDIAS = "medias"; + public static final String FIRST_MEDIA = "first_media"; - public static final String FIRST_MEDIA = "first_media"; + public static final String MENTIONS = "mentions"; - public static final String MENTIONS = "mentions"; + public static final String SORT_ORDER_TIMESTAMP_DESC = STATUS_TIMESTAMP + " DESC"; - public static final String SORT_ORDER_TIMESTAMP_DESC = STATUS_TIMESTAMP + " DESC"; + public static final String SORT_ORDER_STATUS_ID_DESC = STATUS_ID + " DESC"; - public static final String SORT_ORDER_STATUS_ID_DESC = STATUS_ID + " DESC"; + public static final String DEFAULT_SORT_ORDER = SORT_ORDER_TIMESTAMP_DESC; - public static final String DEFAULT_SORT_ORDER = SORT_ORDER_TIMESTAMP_DESC; + public static final String[] COLUMNS = new String[]{_ID, ACCOUNT_ID, STATUS_ID, USER_ID, STATUS_TIMESTAMP, + TEXT_HTML, TEXT_PLAIN, TEXT_UNESCAPED, USER_NAME, USER_SCREEN_NAME, USER_PROFILE_IMAGE_URL, + IN_REPLY_TO_STATUS_ID, IN_REPLY_TO_USER_ID, IN_REPLY_TO_USER_NAME, IN_REPLY_TO_USER_SCREEN_NAME, + SOURCE, LOCATION, RETWEET_COUNT, FAVORITE_COUNT, RETWEET_ID, RETWEET_TIMESTAMP, RETWEETED_BY_USER_ID, + RETWEETED_BY_USER_NAME, RETWEETED_BY_USER_SCREEN_NAME, MY_RETWEET_ID, IS_RETWEET, IS_FAVORITE, + IS_PROTECTED, IS_VERIFIED, IS_FOLLOWING, IS_GAP, IS_POSSIBLY_SENSITIVE, MEDIAS, FIRST_MEDIA, MENTIONS}; - public static final String[] COLUMNS = new String[] { _ID, ACCOUNT_ID, STATUS_ID, USER_ID, STATUS_TIMESTAMP, - TEXT_HTML, TEXT_PLAIN, TEXT_UNESCAPED, USER_NAME, USER_SCREEN_NAME, USER_PROFILE_IMAGE_URL, - IN_REPLY_TO_STATUS_ID, IN_REPLY_TO_USER_ID, IN_REPLY_TO_USER_NAME, IN_REPLY_TO_USER_SCREEN_NAME, - SOURCE, LOCATION, RETWEET_COUNT, FAVORITE_COUNT, RETWEET_ID, RETWEET_TIMESTAMP, RETWEETED_BY_USER_ID, - RETWEETED_BY_USER_NAME, RETWEETED_BY_USER_SCREEN_NAME, MY_RETWEET_ID, IS_RETWEET, IS_FAVORITE, - IS_PROTECTED, IS_VERIFIED, IS_FOLLOWING, IS_GAP, IS_POSSIBLY_SENSITIVE, MEDIAS, FIRST_MEDIA, MENTIONS }; + public static final String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, + TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_INT, TYPE_INT, TYPE_INT, + TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_TEXT, + TYPE_TEXT, TYPE_INT, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, + TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT}; - public static final String[] TYPES = new String[] { TYPE_PRIMARY_KEY, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, - TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_INT, TYPE_INT, TYPE_INT, - TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_TEXT, - TYPE_TEXT, TYPE_INT, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, - TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT }; + } - } + public static interface Tabs extends BaseColumns { + public static final String TABLE_NAME = "tabs"; + public static final String CONTENT_PATH = TABLE_NAME; - public static interface Tabs extends BaseColumns { - public static final String TABLE_NAME = "tabs"; - public static final String CONTENT_PATH = TABLE_NAME; + public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + public static final String NAME = "name"; - public static final String NAME = "name"; + public static final String ICON = "icon"; - public static final String ICON = "icon"; + public static final String TYPE = "type"; - public static final String TYPE = "type"; + public static final String ARGUMENTS = "arguments"; - public static final String ARGUMENTS = "arguments"; + public static final String EXTRAS = "extras"; - public static final String EXTRAS = "extras"; + public static final String POSITION = "position"; - public static final String POSITION = "position"; + public static final String[] COLUMNS = new String[]{_ID, NAME, ICON, TYPE, ARGUMENTS, EXTRAS, POSITION}; - public static final String[] COLUMNS = new String[] { _ID, NAME, ICON, TYPE, ARGUMENTS, EXTRAS, POSITION }; + public static final String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_TEXT_NOT_NULL, TYPE_TEXT, TYPE_TEXT, + TYPE_TEXT, TYPE_TEXT, TYPE_INT}; - public static final String[] TYPES = new String[] { TYPE_PRIMARY_KEY, TYPE_TEXT_NOT_NULL, TYPE_TEXT, TYPE_TEXT, - TYPE_TEXT, TYPE_TEXT, TYPE_INT }; + public static final String DEFAULT_SORT_ORDER = POSITION + " ASC"; + } - public static final String DEFAULT_SORT_ORDER = POSITION + " ASC"; - } + public static interface UnreadCounts extends BaseColumns { - public static interface UnreadCounts extends BaseColumns { + public static final String CONTENT_PATH = "unread_counts"; - public static final String CONTENT_PATH = "unread_counts"; + public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); - public static final Uri CONTENT_URI = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH); + public static final String TAB_POSITION = "tab_position"; - public static final String TAB_POSITION = "tab_position"; + public static final String TAB_TYPE = "tab_type"; - public static final String TAB_TYPE = "tab_type"; + public static final String COUNT = "count"; - public static final String COUNT = "count"; + public static final String[] MATRIX_COLUMNS = new String[]{TAB_POSITION, TAB_TYPE, COUNT}; - public static final String[] MATRIX_COLUMNS = new String[] { TAB_POSITION, TAB_TYPE, COUNT }; + public static final String[] COLUMNS = new String[]{_ID, TAB_POSITION, TAB_TYPE, COUNT}; - public static final String[] COLUMNS = new String[] { _ID, TAB_POSITION, TAB_TYPE, COUNT }; + public static interface ByType extends UnreadCounts { - public static interface ByType extends UnreadCounts { + public static final String CONTENT_PATH_SEGMENT = "by_type"; - public static final String CONTENT_PATH_SEGMENT = "by_type"; + public static final String CONTENT_PATH = UnreadCounts.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; - public static final String CONTENT_PATH = UnreadCounts.CONTENT_PATH + "/" + CONTENT_PATH_SEGMENT; - - public static final Uri CONTENT_URI = Uri.withAppendedPath(UnreadCounts.CONTENT_URI, CONTENT_PATH_SEGMENT); - } - } + public static final Uri CONTENT_URI = Uri.withAppendedPath(UnreadCounts.CONTENT_URI, CONTENT_PATH_SEGMENT); + } + } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/ContentValuesCreator.java b/twidere/src/main/java/org/mariotaku/twidere/util/ContentValuesCreator.java index 5c12efb68..9e952f5b8 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/ContentValuesCreator.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/ContentValuesCreator.java @@ -19,8 +19,6 @@ package org.mariotaku.twidere.util; -import static org.mariotaku.twidere.util.HtmlEscapeHelper.toPlainText; - import android.content.ContentValues; import org.json.JSONException; @@ -44,6 +42,9 @@ import org.mariotaku.twidere.provider.TweetStore.Drafts; import org.mariotaku.twidere.provider.TweetStore.Filters; import org.mariotaku.twidere.provider.TweetStore.Statuses; +import java.util.ArrayList; +import java.util.List; + import twitter4j.DirectMessage; import twitter4j.GeoLocation; import twitter4j.Status; @@ -54,302 +55,305 @@ import twitter4j.User; import twitter4j.auth.AccessToken; import twitter4j.conf.Configuration; -import java.util.ArrayList; -import java.util.List; +import static org.mariotaku.twidere.util.HtmlEscapeHelper.toPlainText; public final class ContentValuesCreator implements TwidereConstants { - public static ContentValues makeAccountContentValuesBasic(final Configuration conf, final String basicUsername, - final String basicPassword, final User user, final int color, final String apiUrlFormat) { - if (user == null || user.getId() <= 0) return null; - final ContentValues values = new ContentValues(); - if (basicUsername == null || basicPassword == null) return null; - values.put(Accounts.BASIC_AUTH_USERNAME, basicUsername); - values.put(Accounts.BASIC_AUTH_PASSWORD, basicPassword); - values.put(Accounts.AUTH_TYPE, Accounts.AUTH_TYPE_BASIC); - values.put(Accounts.ACCOUNT_ID, user.getId()); - values.put(Accounts.SCREEN_NAME, user.getScreenName()); - values.put(Accounts.NAME, user.getName()); - values.put(Accounts.PROFILE_IMAGE_URL, ParseUtils.parseString(user.getProfileImageUrlHttps())); - values.put(Accounts.PROFILE_BANNER_URL, ParseUtils.parseString(user.getProfileBannerImageUrl())); - values.put(Accounts.COLOR, color); - values.put(Accounts.IS_ACTIVATED, 1); - values.put(Accounts.API_URL_FORMAT, apiUrlFormat); - return values; - } + public static ContentValues makeAccountContentValuesBasic(final Configuration conf, final String basicUsername, + final String basicPassword, final User user, final int color, final String apiUrlFormat, + final boolean noVersionSuffix) { + if (user == null || user.getId() <= 0) return null; + final ContentValues values = new ContentValues(); + if (basicUsername == null || basicPassword == null) return null; + values.put(Accounts.BASIC_AUTH_USERNAME, basicUsername); + values.put(Accounts.BASIC_AUTH_PASSWORD, basicPassword); + values.put(Accounts.AUTH_TYPE, Accounts.AUTH_TYPE_BASIC); + values.put(Accounts.ACCOUNT_ID, user.getId()); + values.put(Accounts.SCREEN_NAME, user.getScreenName()); + values.put(Accounts.NAME, user.getName()); + values.put(Accounts.PROFILE_IMAGE_URL, ParseUtils.parseString(user.getProfileImageUrlHttps())); + values.put(Accounts.PROFILE_BANNER_URL, ParseUtils.parseString(user.getProfileBannerImageUrl())); + values.put(Accounts.COLOR, color); + values.put(Accounts.IS_ACTIVATED, 1); + values.put(Accounts.API_URL_FORMAT, apiUrlFormat); + values.put(Accounts.NO_VERSION_SUFFIX, noVersionSuffix); + return values; + } - public static ContentValues makeAccountContentValuesOAuth(final Configuration conf, final AccessToken accessToken, - final User user, final int authType, final int color, final String apiUrlFormat, - final boolean sameOAuthSigningUrl) { - if (user == null || user.getId() <= 0 || accessToken == null || user.getId() != accessToken.getUserId()) - return null; - final ContentValues values = new ContentValues(); - values.put(Accounts.OAUTH_TOKEN, accessToken.getToken()); - values.put(Accounts.OAUTH_TOKEN_SECRET, accessToken.getTokenSecret()); - values.put(Accounts.CONSUMER_KEY, conf.getOAuthConsumerKey()); - values.put(Accounts.CONSUMER_SECRET, conf.getOAuthConsumerSecret()); - values.put(Accounts.AUTH_TYPE, authType); - values.put(Accounts.ACCOUNT_ID, user.getId()); - values.put(Accounts.SCREEN_NAME, user.getScreenName()); - values.put(Accounts.NAME, user.getName()); - values.put(Accounts.PROFILE_IMAGE_URL, ParseUtils.parseString(user.getProfileImageUrlHttps())); - values.put(Accounts.PROFILE_BANNER_URL, ParseUtils.parseString(user.getProfileBannerImageUrl())); - values.put(Accounts.COLOR, color); - values.put(Accounts.IS_ACTIVATED, 1); - values.put(Accounts.API_URL_FORMAT, apiUrlFormat); - values.put(Accounts.SAME_OAUTH_SIGNING_URL, sameOAuthSigningUrl); - return values; - } + public static ContentValues makeAccountContentValuesOAuth(final Configuration conf, final AccessToken accessToken, + final User user, final int authType, final int color, final String apiUrlFormat, + final boolean sameOAuthSigningUrl, final boolean noVersionSuffix) { + if (user == null || user.getId() <= 0 || accessToken == null || user.getId() != accessToken.getUserId()) + return null; + final ContentValues values = new ContentValues(); + values.put(Accounts.OAUTH_TOKEN, accessToken.getToken()); + values.put(Accounts.OAUTH_TOKEN_SECRET, accessToken.getTokenSecret()); + values.put(Accounts.CONSUMER_KEY, conf.getOAuthConsumerKey()); + values.put(Accounts.CONSUMER_SECRET, conf.getOAuthConsumerSecret()); + values.put(Accounts.AUTH_TYPE, authType); + values.put(Accounts.ACCOUNT_ID, user.getId()); + values.put(Accounts.SCREEN_NAME, user.getScreenName()); + values.put(Accounts.NAME, user.getName()); + values.put(Accounts.PROFILE_IMAGE_URL, ParseUtils.parseString(user.getProfileImageUrlHttps())); + values.put(Accounts.PROFILE_BANNER_URL, ParseUtils.parseString(user.getProfileBannerImageUrl())); + values.put(Accounts.COLOR, color); + values.put(Accounts.IS_ACTIVATED, 1); + values.put(Accounts.API_URL_FORMAT, apiUrlFormat); + values.put(Accounts.SAME_OAUTH_SIGNING_URL, sameOAuthSigningUrl); + values.put(Accounts.NO_VERSION_SUFFIX, noVersionSuffix); + return values; + } - public static ContentValues makeAccountContentValuesTWIP(final Configuration conf, final User user, - final int color, final String apiUrlFormat) { - if (user == null || user.getId() <= 0) return null; - final ContentValues values = new ContentValues(); - values.put(Accounts.AUTH_TYPE, Accounts.AUTH_TYPE_TWIP_O_MODE); - values.put(Accounts.ACCOUNT_ID, user.getId()); - values.put(Accounts.SCREEN_NAME, user.getScreenName()); - values.put(Accounts.NAME, user.getName()); - values.put(Accounts.PROFILE_IMAGE_URL, ParseUtils.parseString(user.getProfileImageUrlHttps())); - values.put(Accounts.PROFILE_BANNER_URL, ParseUtils.parseString(user.getProfileBannerImageUrl())); - values.put(Accounts.COLOR, color); - values.put(Accounts.IS_ACTIVATED, 1); - values.put(Accounts.API_URL_FORMAT, apiUrlFormat); - return values; - } + public static ContentValues makeAccountContentValuesTWIP(final Configuration conf, final User user, + final int color, final String apiUrlFormat, final boolean noVersionSuffix) { + if (user == null || user.getId() <= 0) return null; + final ContentValues values = new ContentValues(); + values.put(Accounts.AUTH_TYPE, Accounts.AUTH_TYPE_TWIP_O_MODE); + values.put(Accounts.ACCOUNT_ID, user.getId()); + values.put(Accounts.SCREEN_NAME, user.getScreenName()); + values.put(Accounts.NAME, user.getName()); + values.put(Accounts.PROFILE_IMAGE_URL, ParseUtils.parseString(user.getProfileImageUrlHttps())); + values.put(Accounts.PROFILE_BANNER_URL, ParseUtils.parseString(user.getProfileBannerImageUrl())); + values.put(Accounts.COLOR, color); + values.put(Accounts.IS_ACTIVATED, 1); + values.put(Accounts.API_URL_FORMAT, apiUrlFormat); + values.put(Accounts.NO_VERSION_SUFFIX, noVersionSuffix); + return values; + } - public static ContentValues makeCachedUserContentValues(final User user) { - if (user == null || user.getId() <= 0) return null; - final String profile_image_url = ParseUtils.parseString(user.getProfileImageUrlHttps()); - final String url = ParseUtils.parseString(user.getURL()); - final URLEntity[] urls = user.getURLEntities(); - final ContentValues values = new ContentValues(); - values.put(CachedUsers.USER_ID, user.getId()); - values.put(CachedUsers.NAME, user.getName()); - values.put(CachedUsers.SCREEN_NAME, user.getScreenName()); - values.put(CachedUsers.PROFILE_IMAGE_URL, profile_image_url); - values.put(CachedUsers.CREATED_AT, user.getCreatedAt().getTime()); - values.put(CachedUsers.IS_PROTECTED, user.isProtected()); - values.put(CachedUsers.IS_VERIFIED, user.isVerified()); - values.put(CachedUsers.IS_FOLLOWING, user.isFollowing()); - values.put(CachedUsers.FAVORITES_COUNT, user.getFavouritesCount()); - values.put(CachedUsers.FOLLOWERS_COUNT, user.getFollowersCount()); - values.put(CachedUsers.FRIENDS_COUNT, user.getFriendsCount()); - values.put(CachedUsers.STATUSES_COUNT, user.getStatusesCount()); - values.put(CachedUsers.LOCATION, user.getLocation()); - values.put(CachedUsers.DESCRIPTION_PLAIN, user.getDescription()); - values.put(CachedUsers.DESCRIPTION_HTML, Utils.formatUserDescription(user)); - values.put(CachedUsers.DESCRIPTION_EXPANDED, Utils.formatExpandedUserDescription(user)); - values.put(CachedUsers.URL, url); - values.put(CachedUsers.URL_EXPANDED, - url != null && urls != null && urls.length > 0 ? ParseUtils.parseString(urls[0].getExpandedURL()) - : null); - values.put(CachedUsers.PROFILE_BANNER_URL, user.getProfileBannerImageUrl()); - return values; - } + public static ContentValues makeCachedUserContentValues(final User user) { + if (user == null || user.getId() <= 0) return null; + final String profile_image_url = ParseUtils.parseString(user.getProfileImageUrlHttps()); + final String url = ParseUtils.parseString(user.getURL()); + final URLEntity[] urls = user.getURLEntities(); + final ContentValues values = new ContentValues(); + values.put(CachedUsers.USER_ID, user.getId()); + values.put(CachedUsers.NAME, user.getName()); + values.put(CachedUsers.SCREEN_NAME, user.getScreenName()); + values.put(CachedUsers.PROFILE_IMAGE_URL, profile_image_url); + values.put(CachedUsers.CREATED_AT, user.getCreatedAt().getTime()); + values.put(CachedUsers.IS_PROTECTED, user.isProtected()); + values.put(CachedUsers.IS_VERIFIED, user.isVerified()); + values.put(CachedUsers.IS_FOLLOWING, user.isFollowing()); + values.put(CachedUsers.FAVORITES_COUNT, user.getFavouritesCount()); + values.put(CachedUsers.FOLLOWERS_COUNT, user.getFollowersCount()); + values.put(CachedUsers.FRIENDS_COUNT, user.getFriendsCount()); + values.put(CachedUsers.STATUSES_COUNT, user.getStatusesCount()); + values.put(CachedUsers.LOCATION, user.getLocation()); + values.put(CachedUsers.DESCRIPTION_PLAIN, user.getDescription()); + values.put(CachedUsers.DESCRIPTION_HTML, Utils.formatUserDescription(user)); + values.put(CachedUsers.DESCRIPTION_EXPANDED, Utils.formatExpandedUserDescription(user)); + values.put(CachedUsers.URL, url); + values.put(CachedUsers.URL_EXPANDED, + url != null && urls != null && urls.length > 0 ? ParseUtils.parseString(urls[0].getExpandedURL()) + : null); + values.put(CachedUsers.PROFILE_BANNER_URL, user.getProfileBannerImageUrl()); + return values; + } - public static ContentValues makeDirectMessageContentValues(final DirectMessage message, final long account_id, - final boolean is_outgoing) { - if (message == null || message.getId() <= 0) return null; - final ContentValues values = new ContentValues(); - final User sender = message.getSender(), recipient = message.getRecipient(); - if (sender == null || recipient == null) return null; - final String sender_profile_image_url = ParseUtils.parseString(sender.getProfileImageUrlHttps()); - final String recipient_profile_image_url = ParseUtils.parseString(recipient.getProfileImageUrlHttps()); - values.put(DirectMessages.ACCOUNT_ID, account_id); - values.put(DirectMessages.MESSAGE_ID, message.getId()); - values.put(DirectMessages.MESSAGE_TIMESTAMP, message.getCreatedAt().getTime()); - values.put(DirectMessages.SENDER_ID, sender.getId()); - values.put(DirectMessages.RECIPIENT_ID, recipient.getId()); - final String text_html = Utils.formatDirectMessageText(message); - values.put(DirectMessages.TEXT_HTML, text_html); - values.put(DirectMessages.TEXT_PLAIN, message.getText()); - values.put(DirectMessages.TEXT_UNESCAPED, toPlainText(text_html)); - values.put(DirectMessages.IS_OUTGOING, is_outgoing); - values.put(DirectMessages.SENDER_NAME, sender.getName()); - values.put(DirectMessages.SENDER_SCREEN_NAME, sender.getScreenName()); - values.put(DirectMessages.RECIPIENT_NAME, recipient.getName()); - values.put(DirectMessages.RECIPIENT_SCREEN_NAME, recipient.getScreenName()); - values.put(DirectMessages.SENDER_PROFILE_IMAGE_URL, sender_profile_image_url); - values.put(DirectMessages.RECIPIENT_PROFILE_IMAGE_URL, recipient_profile_image_url); - final ParcelableMedia[] medias = ParcelableMedia.fromEntities(message); - if (medias != null) { - values.put(DirectMessages.MEDIAS, JSONSerializer.toJSONArrayString(medias)); - values.put(DirectMessages.FIRST_MEDIA, medias[0].url); - } - return values; - } + public static ContentValues makeDirectMessageContentValues(final DirectMessage message, final long account_id, + final boolean is_outgoing) { + if (message == null || message.getId() <= 0) return null; + final ContentValues values = new ContentValues(); + final User sender = message.getSender(), recipient = message.getRecipient(); + if (sender == null || recipient == null) return null; + final String sender_profile_image_url = ParseUtils.parseString(sender.getProfileImageUrlHttps()); + final String recipient_profile_image_url = ParseUtils.parseString(recipient.getProfileImageUrlHttps()); + values.put(DirectMessages.ACCOUNT_ID, account_id); + values.put(DirectMessages.MESSAGE_ID, message.getId()); + values.put(DirectMessages.MESSAGE_TIMESTAMP, message.getCreatedAt().getTime()); + values.put(DirectMessages.SENDER_ID, sender.getId()); + values.put(DirectMessages.RECIPIENT_ID, recipient.getId()); + final String text_html = Utils.formatDirectMessageText(message); + values.put(DirectMessages.TEXT_HTML, text_html); + values.put(DirectMessages.TEXT_PLAIN, message.getText()); + values.put(DirectMessages.TEXT_UNESCAPED, toPlainText(text_html)); + values.put(DirectMessages.IS_OUTGOING, is_outgoing); + values.put(DirectMessages.SENDER_NAME, sender.getName()); + values.put(DirectMessages.SENDER_SCREEN_NAME, sender.getScreenName()); + values.put(DirectMessages.RECIPIENT_NAME, recipient.getName()); + values.put(DirectMessages.RECIPIENT_SCREEN_NAME, recipient.getScreenName()); + values.put(DirectMessages.SENDER_PROFILE_IMAGE_URL, sender_profile_image_url); + values.put(DirectMessages.RECIPIENT_PROFILE_IMAGE_URL, recipient_profile_image_url); + final ParcelableMedia[] medias = ParcelableMedia.fromEntities(message); + if (medias != null) { + values.put(DirectMessages.MEDIAS, JSONSerializer.toJSONArrayString(medias)); + values.put(DirectMessages.FIRST_MEDIA, medias[0].url); + } + return values; + } - public static ContentValues makeDirectMessageContentValues(final ParcelableDirectMessage message) { - if (message == null || message.id <= 0) return null; - final ContentValues values = new ContentValues(); - values.put(DirectMessages.ACCOUNT_ID, message.account_id); - values.put(DirectMessages.MESSAGE_ID, message.id); - values.put(DirectMessages.MESSAGE_TIMESTAMP, message.timestamp); - values.put(DirectMessages.SENDER_ID, message.sender_id); - values.put(DirectMessages.RECIPIENT_ID, message.recipient_id); - values.put(DirectMessages.TEXT_HTML, message.text_html); - values.put(DirectMessages.TEXT_PLAIN, message.text_plain); - values.put(DirectMessages.IS_OUTGOING, message.is_outgoing); - values.put(DirectMessages.SENDER_NAME, message.sender_name); - values.put(DirectMessages.SENDER_SCREEN_NAME, message.sender_screen_name); - values.put(DirectMessages.RECIPIENT_NAME, message.recipient_name); - values.put(DirectMessages.RECIPIENT_SCREEN_NAME, message.recipient_screen_name); - values.put(DirectMessages.SENDER_PROFILE_IMAGE_URL, message.sender_profile_image_url); - values.put(DirectMessages.RECIPIENT_PROFILE_IMAGE_URL, message.recipient_profile_image_url); - if (message.medias != null) { - values.put(Statuses.MEDIAS, JSONSerializer.toJSONArrayString(message.medias)); - values.put(Statuses.FIRST_MEDIA, message.medias[0].url); - } - return values; - } + public static ContentValues makeDirectMessageContentValues(final ParcelableDirectMessage message) { + if (message == null || message.id <= 0) return null; + final ContentValues values = new ContentValues(); + values.put(DirectMessages.ACCOUNT_ID, message.account_id); + values.put(DirectMessages.MESSAGE_ID, message.id); + values.put(DirectMessages.MESSAGE_TIMESTAMP, message.timestamp); + values.put(DirectMessages.SENDER_ID, message.sender_id); + values.put(DirectMessages.RECIPIENT_ID, message.recipient_id); + values.put(DirectMessages.TEXT_HTML, message.text_html); + values.put(DirectMessages.TEXT_PLAIN, message.text_plain); + values.put(DirectMessages.IS_OUTGOING, message.is_outgoing); + values.put(DirectMessages.SENDER_NAME, message.sender_name); + values.put(DirectMessages.SENDER_SCREEN_NAME, message.sender_screen_name); + values.put(DirectMessages.RECIPIENT_NAME, message.recipient_name); + values.put(DirectMessages.RECIPIENT_SCREEN_NAME, message.recipient_screen_name); + values.put(DirectMessages.SENDER_PROFILE_IMAGE_URL, message.sender_profile_image_url); + values.put(DirectMessages.RECIPIENT_PROFILE_IMAGE_URL, message.recipient_profile_image_url); + if (message.medias != null) { + values.put(Statuses.MEDIAS, JSONSerializer.toJSONArrayString(message.medias)); + values.put(Statuses.FIRST_MEDIA, message.medias[0].url); + } + return values; + } - public static ContentValues makeDirectMessageDraftContentValues(final long accountId, final long recipientId, - final String text, final String imageUri) { - final ContentValues values = new ContentValues(); - values.put(Drafts.ACTION_TYPE, Drafts.ACTION_SEND_DIRECT_MESSAGE); - values.put(Drafts.TEXT, text); - values.put(Drafts.ACCOUNT_IDS, ArrayUtils.toString(new long[] { accountId }, ',', false)); - values.put(Drafts.TIMESTAMP, System.currentTimeMillis()); - if (imageUri != null) { - final ParcelableMediaUpdate[] medias = { new ParcelableMediaUpdate(imageUri, 0) }; - values.put(Drafts.MEDIAS, JSONSerializer.toJSONArrayString(medias)); - } - final JSONObject extras = new JSONObject(); - try { - extras.put(EXTRA_RECIPIENT_ID, recipientId); - } catch (final JSONException e) { - e.printStackTrace(); - } - values.put(Drafts.ACTION_EXTRAS, extras.toString()); - return values; - } + public static ContentValues makeDirectMessageDraftContentValues(final long accountId, final long recipientId, + final String text, final String imageUri) { + final ContentValues values = new ContentValues(); + values.put(Drafts.ACTION_TYPE, Drafts.ACTION_SEND_DIRECT_MESSAGE); + values.put(Drafts.TEXT, text); + values.put(Drafts.ACCOUNT_IDS, ArrayUtils.toString(new long[]{accountId}, ',', false)); + values.put(Drafts.TIMESTAMP, System.currentTimeMillis()); + if (imageUri != null) { + final ParcelableMediaUpdate[] medias = {new ParcelableMediaUpdate(imageUri, 0)}; + values.put(Drafts.MEDIAS, JSONSerializer.toJSONArrayString(medias)); + } + final JSONObject extras = new JSONObject(); + try { + extras.put(EXTRA_RECIPIENT_ID, recipientId); + } catch (final JSONException e) { + e.printStackTrace(); + } + values.put(Drafts.ACTION_EXTRAS, extras.toString()); + return values; + } - public static ContentValues makeFilterdUserContentValues(final ParcelableStatus status) { - if (status == null) return null; - final ContentValues values = new ContentValues(); - values.put(Filters.Users.USER_ID, status.user_id); - values.put(Filters.Users.NAME, status.user_name); - values.put(Filters.Users.SCREEN_NAME, status.user_screen_name); - return values; - } + public static ContentValues makeFilteredUserContentValues(final ParcelableStatus status) { + if (status == null) return null; + final ContentValues values = new ContentValues(); + values.put(Filters.Users.USER_ID, status.user_id); + values.put(Filters.Users.NAME, status.user_name); + values.put(Filters.Users.SCREEN_NAME, status.user_screen_name); + return values; + } - public static ContentValues makeFilterdUserContentValues(final ParcelableUser user) { - if (user == null) return null; - final ContentValues values = new ContentValues(); - values.put(Filters.Users.USER_ID, user.id); - values.put(Filters.Users.NAME, user.name); - values.put(Filters.Users.SCREEN_NAME, user.screen_name); - return values; - } + public static ContentValues makeFilteredUserContentValues(final ParcelableUser user) { + if (user == null) return null; + final ContentValues values = new ContentValues(); + values.put(Filters.Users.USER_ID, user.id); + values.put(Filters.Users.NAME, user.name); + values.put(Filters.Users.SCREEN_NAME, user.screen_name); + return values; + } - public static ContentValues makeFilterdUserContentValues(final ParcelableUserMention user) { - if (user == null) return null; - final ContentValues values = new ContentValues(); - values.put(Filters.Users.USER_ID, user.id); - values.put(Filters.Users.NAME, user.name); - values.put(Filters.Users.SCREEN_NAME, user.screen_name); - return values; - } + public static ContentValues makeFilteredUserContentValues(final ParcelableUserMention user) { + if (user == null) return null; + final ContentValues values = new ContentValues(); + values.put(Filters.Users.USER_ID, user.id); + values.put(Filters.Users.NAME, user.name); + values.put(Filters.Users.SCREEN_NAME, user.screen_name); + return values; + } - public static ContentValues makeStatusContentValues(final Status orig, final long account_id) { - if (orig == null || orig.getId() <= 0) return null; - final ContentValues values = new ContentValues(); - values.put(Statuses.ACCOUNT_ID, account_id); - values.put(Statuses.STATUS_ID, orig.getId()); - values.put(Statuses.STATUS_TIMESTAMP, orig.getCreatedAt().getTime()); - values.put(Statuses.MY_RETWEET_ID, orig.getCurrentUserRetweet()); - final boolean is_retweet = orig.isRetweet(); - final Status status; - final Status retweeted_status = is_retweet ? orig.getRetweetedStatus() : null; - if (retweeted_status != null) { - final User retweet_user = orig.getUser(); - values.put(Statuses.RETWEET_ID, retweeted_status.getId()); - values.put(Statuses.RETWEET_TIMESTAMP, retweeted_status.getCreatedAt().getTime()); - values.put(Statuses.RETWEETED_BY_USER_ID, retweet_user.getId()); - values.put(Statuses.RETWEETED_BY_USER_NAME, retweet_user.getName()); - values.put(Statuses.RETWEETED_BY_USER_SCREEN_NAME, retweet_user.getScreenName()); - status = retweeted_status; - } else { - status = orig; - } - final User user = status.getUser(); - if (user != null) { - final long userId = user.getId(); - final String profileImageUrl = ParseUtils.parseString(user.getProfileImageUrlHttps()); - final String name = user.getName(), screenName = user.getScreenName(); - values.put(Statuses.USER_ID, userId); - values.put(Statuses.USER_NAME, name); - values.put(Statuses.USER_SCREEN_NAME, screenName); - values.put(Statuses.IS_PROTECTED, user.isProtected()); - values.put(Statuses.IS_VERIFIED, user.isVerified()); - values.put(Statuses.USER_PROFILE_IMAGE_URL, profileImageUrl); - values.put(CachedUsers.IS_FOLLOWING, user.isFollowing()); - } - final String text_html = Utils.formatStatusText(status); - values.put(Statuses.TEXT_HTML, text_html); - values.put(Statuses.TEXT_PLAIN, status.getText()); - values.put(Statuses.TEXT_UNESCAPED, toPlainText(text_html)); - values.put(Statuses.RETWEET_COUNT, status.getRetweetCount()); - values.put(Statuses.IN_REPLY_TO_STATUS_ID, status.getInReplyToStatusId()); - values.put(Statuses.IN_REPLY_TO_USER_ID, status.getInReplyToUserId()); - values.put(Statuses.IN_REPLY_TO_USER_NAME, Utils.getInReplyToName(status)); - values.put(Statuses.IN_REPLY_TO_USER_SCREEN_NAME, status.getInReplyToScreenName()); - values.put(Statuses.SOURCE, status.getSource()); - values.put(Statuses.IS_POSSIBLY_SENSITIVE, status.isPossiblySensitive()); - final GeoLocation location = status.getGeoLocation(); - if (location != null) { - values.put(Statuses.LOCATION, location.getLatitude() + "," + location.getLongitude()); - } - values.put(Statuses.IS_RETWEET, is_retweet); - values.put(Statuses.IS_FAVORITE, status.isFavorited()); - final ParcelableMedia[] medias = ParcelableMedia.fromEntities(status); - if (medias != null) { - values.put(Statuses.MEDIAS, JSONSerializer.toJSONArrayString(medias)); - values.put(Statuses.FIRST_MEDIA, medias[0].url); - } - final ParcelableUserMention[] mentions = ParcelableUserMention.fromStatus(status); - if (mentions != null) { - values.put(Statuses.MENTIONS, JSONSerializer.toJSONArrayString(mentions)); - } - return values; - } + public static ContentValues makeStatusContentValues(final Status orig, final long account_id) { + if (orig == null || orig.getId() <= 0) return null; + final ContentValues values = new ContentValues(); + values.put(Statuses.ACCOUNT_ID, account_id); + values.put(Statuses.STATUS_ID, orig.getId()); + values.put(Statuses.STATUS_TIMESTAMP, orig.getCreatedAt().getTime()); + values.put(Statuses.MY_RETWEET_ID, orig.getCurrentUserRetweet()); + final boolean isRetweet = orig.isRetweet(); + final Status status; + final Status retweetedStatus = isRetweet ? orig.getRetweetedStatus() : null; + if (retweetedStatus != null) { + final User retweetUser = orig.getUser(); + values.put(Statuses.RETWEET_ID, retweetedStatus.getId()); + values.put(Statuses.RETWEET_TIMESTAMP, retweetedStatus.getCreatedAt().getTime()); + values.put(Statuses.RETWEETED_BY_USER_ID, retweetUser.getId()); + values.put(Statuses.RETWEETED_BY_USER_NAME, retweetUser.getName()); + values.put(Statuses.RETWEETED_BY_USER_SCREEN_NAME, retweetUser.getScreenName()); + status = retweetedStatus; + } else { + status = orig; + } + final User user = status.getUser(); + if (user != null) { + final long userId = user.getId(); + final String profileImageUrl = ParseUtils.parseString(user.getProfileImageUrlHttps()); + final String name = user.getName(), screenName = user.getScreenName(); + values.put(Statuses.USER_ID, userId); + values.put(Statuses.USER_NAME, name); + values.put(Statuses.USER_SCREEN_NAME, screenName); + values.put(Statuses.IS_PROTECTED, user.isProtected()); + values.put(Statuses.IS_VERIFIED, user.isVerified()); + values.put(Statuses.USER_PROFILE_IMAGE_URL, profileImageUrl); + values.put(CachedUsers.IS_FOLLOWING, user.isFollowing()); + } + final String text_html = Utils.formatStatusText(status); + values.put(Statuses.TEXT_HTML, text_html); + values.put(Statuses.TEXT_PLAIN, status.getText()); + values.put(Statuses.TEXT_UNESCAPED, toPlainText(text_html)); + values.put(Statuses.RETWEET_COUNT, status.getRetweetCount()); + values.put(Statuses.IN_REPLY_TO_STATUS_ID, status.getInReplyToStatusId()); + values.put(Statuses.IN_REPLY_TO_USER_ID, status.getInReplyToUserId()); + values.put(Statuses.IN_REPLY_TO_USER_NAME, Utils.getInReplyToName(status)); + values.put(Statuses.IN_REPLY_TO_USER_SCREEN_NAME, status.getInReplyToScreenName()); + values.put(Statuses.SOURCE, status.getSource()); + values.put(Statuses.IS_POSSIBLY_SENSITIVE, status.isPossiblySensitive()); + final GeoLocation location = status.getGeoLocation(); + if (location != null) { + values.put(Statuses.LOCATION, location.getLatitude() + "," + location.getLongitude()); + } + values.put(Statuses.IS_RETWEET, isRetweet); + values.put(Statuses.IS_FAVORITE, status.isFavorited()); + final ParcelableMedia[] medias = ParcelableMedia.fromEntities(status); + if (medias != null) { + values.put(Statuses.MEDIAS, JSONSerializer.toJSONArrayString(medias)); + values.put(Statuses.FIRST_MEDIA, medias[0].url); + } + final ParcelableUserMention[] mentions = ParcelableUserMention.fromStatus(status); + if (mentions != null) { + values.put(Statuses.MENTIONS, JSONSerializer.toJSONArrayString(mentions)); + } + return values; + } - public static ContentValues makeStatusDraftContentValues(final ParcelableStatusUpdate status) { - return makeStatusDraftContentValues(status, Account.getAccountIds(status.accounts)); - } + public static ContentValues makeStatusDraftContentValues(final ParcelableStatusUpdate status) { + return makeStatusDraftContentValues(status, Account.getAccountIds(status.accounts)); + } - public static ContentValues makeStatusDraftContentValues(final ParcelableStatusUpdate status, - final long[] accountIds) { - final ContentValues values = new ContentValues(); - values.put(Drafts.ACTION_TYPE, Drafts.ACTION_UPDATE_STATUS); - values.put(Drafts.TEXT, status.text); - values.put(Drafts.ACCOUNT_IDS, ArrayUtils.toString(accountIds, ',', false)); - values.put(Drafts.IN_REPLY_TO_STATUS_ID, status.in_reply_to_status_id); - values.put(Drafts.LOCATION, ParcelableLocation.toString(status.location)); - values.put(Drafts.IS_POSSIBLY_SENSITIVE, status.is_possibly_sensitive); - values.put(Drafts.TIMESTAMP, System.currentTimeMillis()); - if (status.medias != null) { - values.put(Drafts.MEDIAS, JSONSerializer.toJSONArrayString(status.medias)); - } - return values; - } + public static ContentValues makeStatusDraftContentValues(final ParcelableStatusUpdate status, + final long[] accountIds) { + final ContentValues values = new ContentValues(); + values.put(Drafts.ACTION_TYPE, Drafts.ACTION_UPDATE_STATUS); + values.put(Drafts.TEXT, status.text); + values.put(Drafts.ACCOUNT_IDS, ArrayUtils.toString(accountIds, ',', false)); + values.put(Drafts.IN_REPLY_TO_STATUS_ID, status.in_reply_to_status_id); + values.put(Drafts.LOCATION, ParcelableLocation.toString(status.location)); + values.put(Drafts.IS_POSSIBLY_SENSITIVE, status.is_possibly_sensitive); + values.put(Drafts.TIMESTAMP, System.currentTimeMillis()); + if (status.medias != null) { + values.put(Drafts.MEDIAS, JSONSerializer.toJSONArrayString(status.medias)); + } + return values; + } - public static ContentValues[] makeTrendsContentValues(final List trends_list) { - if (trends_list == null) return new ContentValues[0]; - final List result_list = new ArrayList(); - for (final Trends trends : trends_list) { - if (trends == null) { - continue; - } - final long timestamp = trends.getTrendAt().getTime(); - for (final Trend trend : trends.getTrends()) { - final ContentValues values = new ContentValues(); - values.put(CachedTrends.NAME, trend.getName()); - values.put(CachedTrends.TIMESTAMP, timestamp); - result_list.add(values); - } - } - return result_list.toArray(new ContentValues[result_list.size()]); - } + public static ContentValues[] makeTrendsContentValues(final List trendsList) { + if (trendsList == null) return new ContentValues[0]; + final List resultList = new ArrayList<>(); + for (final Trends trends : trendsList) { + if (trends == null) { + continue; + } + final long timestamp = trends.getTrendAt().getTime(); + for (final Trend trend : trends.getTrends()) { + final ContentValues values = new ContentValues(); + values.put(CachedTrends.NAME, trend.getName()); + values.put(CachedTrends.TIMESTAMP, timestamp); + resultList.add(values); + } + } + return resultList.toArray(new ContentValues[resultList.size()]); + } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/MultiSelectEventHandler.java b/twidere/src/main/java/org/mariotaku/twidere/util/MultiSelectEventHandler.java index 81095471f..a3ed280eb 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/MultiSelectEventHandler.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/MultiSelectEventHandler.java @@ -52,7 +52,6 @@ import java.util.TreeSet; import de.keyboardsurfer.android.widget.crouton.Crouton; import de.keyboardsurfer.android.widget.crouton.CroutonStyle; -import static org.mariotaku.twidere.util.ContentValuesCreator.makeFilterdUserContentValues; import static org.mariotaku.twidere.util.Utils.getAccountScreenNames; import static org.mariotaku.twidere.util.content.ContentResolverUtils.bulkDelete; import static org.mariotaku.twidere.util.content.ContentResolverUtils.bulkInsert; @@ -145,11 +144,11 @@ public class MultiSelectEventHandler implements Constants, ActionMode.Callback, if (object instanceof ParcelableStatus) { final ParcelableStatus status = (ParcelableStatus) object; userIds.add(status.user_id); - valuesList.add(makeFilterdUserContentValues(status)); + valuesList.add(ContentValuesCreator.makeFilteredUserContentValues(status)); } else if (object instanceof ParcelableUser) { final ParcelableUser user = (ParcelableUser) object; userIds.add(user.id); - valuesList.add(makeFilterdUserContentValues(user)); + valuesList.add(ContentValuesCreator.makeFilteredUserContentValues(user)); } else { continue; } diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/SpannableStringBuilder.java b/twidere/src/main/java/org/mariotaku/twidere/util/SpannableStringBuilder.java deleted file mode 100644 index f7691aa02..000000000 --- a/twidere/src/main/java/org/mariotaku/twidere/util/SpannableStringBuilder.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.mariotaku.twidere.util; - -public class SpannableStringBuilder { - -} diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/ThemeUtils.java b/twidere/src/main/java/org/mariotaku/twidere/util/ThemeUtils.java index bfe4f4185..2c976cf22 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/ThemeUtils.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/ThemeUtils.java @@ -35,10 +35,14 @@ import android.support.annotation.NonNull; import android.text.TextPaint; import android.text.TextUtils; import android.util.AttributeSet; +import android.view.ContextMenu.ContextMenuInfo; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; import android.view.View; +import org.mariotaku.menucomponent.widget.MenuBar.MenuBarMenuInfo; import org.mariotaku.refreshnow.widget.RefreshNowConfig; import org.mariotaku.refreshnow.widget.RefreshNowProgressIndicator.IndicatorConfig; import org.mariotaku.twidere.Constants; @@ -114,6 +118,25 @@ public class ThemeUtils implements Constants { d.setAlpha(getUserThemeBackgroundAlpha(context)); } + public static void applyColorFilterToMenuIcon(Menu menu, int color, int popupColor, PorterDuff.Mode mode, int... excludedGroups) { + for (int i = 0, j = menu.size(); i < j; i++) { + final MenuItem item = menu.getItem(i); + final Drawable icon = item.getIcon(); + final ContextMenuInfo info = item.getMenuInfo(); + if (ArrayUtils.contains(excludedGroups, item.getGroupId())) { + icon.mutate().clearColorFilter(); + } else if (info instanceof MenuBarMenuInfo) { + final boolean inPopup = ((MenuBarMenuInfo) info).isInPopup(); + icon.mutate().setColorFilter(inPopup ? popupColor : color, mode); + } else { + icon.mutate().setColorFilter(color, mode); + } + if (item.hasSubMenu()) { + applyColorFilterToMenuIcon(item.getSubMenu(), color, popupColor, mode, excludedGroups); + } + } + } + public static IndicatorConfig buildRefreshIndicatorConfig(final Context context) { final IndicatorConfig.Builder builder = new IndicatorConfig.Builder(context); final Resources res = context.getResources(); diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java b/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java index fda4b6ca3..fa5a4d8fe 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java @@ -1493,7 +1493,8 @@ public final class Utils implements Constants, TwitterConstants { public static String getApiUrl(final String pattern, final String domain, final String appendPath) { final String urlBase = getApiBaseUrl(pattern, domain); - if (urlBase == null || appendPath == null) return urlBase; + if (urlBase == null) return null; + if (appendPath == null) return urlBase.endsWith("/") ? urlBase : urlBase + "/"; final StringBuilder sb = new StringBuilder(urlBase); if (urlBase.endsWith("/")) { sb.append(appendPath.startsWith("/") ? appendPath.substring(1) : appendPath); @@ -2250,9 +2251,10 @@ public final class Utils implements Constants, TwitterConstants { final String prefConsumerSecret = prefs.getString(KEY_CONSUMER_SECRET, TWITTER_CONSUMER_SECRET); final ConfigurationBuilder cb = new ConfigurationBuilder(); if (!isEmpty(account.api_url_format)) { - cb.setRestBaseURL(getApiUrl(account.api_url_format, "api", "/1.1/")); + final String versionSuffix = account.no_version_suffix ? null : "/1.1/"; + cb.setRestBaseURL(getApiUrl(account.api_url_format, "api", versionSuffix)); cb.setOAuthBaseURL(getApiUrl(account.api_url_format, "api", "/oauth/")); - cb.setUploadBaseURL(getApiUrl(account.api_url_format, "upload", "/1.1/")); + cb.setUploadBaseURL(getApiUrl(account.api_url_format, "upload", versionSuffix)); if (!account.same_oauth_signing_url) { cb.setSigningRestBaseURL(DEFAULT_SIGNING_REST_BASE_URL); cb.setSigningOAuthBaseURL(DEFAULT_SIGNING_OAUTH_BASE_URL); @@ -2291,7 +2293,7 @@ public final class Utils implements Constants, TwitterConstants { final String where = Where.equals(new Column(Accounts.ACCOUNT_ID), accountId).getSQL(); final Cursor c = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI, - Accounts.COLUMNS, where.toString(), null, null); + Accounts.COLUMNS, where, null, null); if (c == null) return null; try { if (!c.moveToFirst()) return null; @@ -2416,7 +2418,7 @@ public final class Utils implements Constants, TwitterConstants { // versions final String where = Where.equals(new Column(Accounts.ACCOUNT_ID), accountId).getSQL(); final Cursor c = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI, - Accounts.COLUMNS, where.toString(), null, null); + Accounts.COLUMNS, where, null, null); if (c == null) return null; try { if (!c.moveToFirst()) return null; @@ -2793,22 +2795,22 @@ public final class Utils implements Constants, TwitterConstants { // SCREENLAYOUT_LAYOUTDIR_RTL; } - public static boolean isSameAccount(final Context context, final long account_id, final long user_id) { - if (context == null || account_id <= 0 || user_id <= 0) return false; - return account_id == user_id; + public static boolean isSameAccount(final Context context, final long accountId, final long userId) { + if (context == null || accountId <= 0 || userId <= 0) return false; + return accountId == userId; } - public static boolean isSameAccount(final Context context, final long account_id, final String screen_name) { - if (context == null || account_id <= 0 || screen_name == null) return false; - return screen_name.equalsIgnoreCase(getAccountScreenName(context, account_id)); + public static boolean isSameAccount(final Context context, final long accountId, final String screenName) { + if (context == null || accountId <= 0 || screenName == null) return false; + return screenName.equalsIgnoreCase(getAccountScreenName(context, accountId)); } - public static boolean isUserLoggedIn(final Context context, final long account_id) { + public static boolean isUserLoggedIn(final Context context, final long accountId) { if (context == null) return false; final long[] ids = getAccountIds(context); if (ids == null) return false; for (final long id : ids) { - if (id == account_id) return true; + if (id == accountId) return true; } return false; } @@ -3483,11 +3485,11 @@ public final class Utils implements Constants, TwitterConstants { addIntentToMenuForExtension(context, menu, MENU_GROUP_STATUS_EXTENSION, INTENT_ACTION_EXTENSION_OPEN_STATUS, EXTRA_STATUS, EXTRA_STATUS_JSON, status); final MenuItem shareItem = menu.findItem(R.id.share_submenu); - final Menu shareSubmenu = shareItem != null && shareItem.hasSubMenu() ? shareItem.getSubMenu() : null; - if (shareSubmenu != null) { + final Menu shareSubMenu = shareItem != null && shareItem.hasSubMenu() ? shareItem.getSubMenu() : null; + if (shareSubMenu != null) { final Intent shareIntent = createStatusShareIntent(context, status); - shareSubmenu.removeGroup(MENU_GROUP_STATUS_SHARE); - addIntentToMenu(context, shareSubmenu, shareIntent, MENU_GROUP_STATUS_SHARE); + shareSubMenu.removeGroup(MENU_GROUP_STATUS_SHARE); + addIntentToMenu(context, shareSubMenu, shareIntent, MENU_GROUP_STATUS_SHARE); } } @@ -3813,15 +3815,13 @@ public final class Utils implements Constants, TwitterConstants { } private static boolean isExtensionUseJSON(final ResolveInfo info) { - if (info == null || info.activityInfo == null) return true; + if (info == null || info.activityInfo == null) return false; final ActivityInfo activityInfo = info.activityInfo; if (activityInfo.metaData != null && activityInfo.metaData.containsKey(METADATA_KEY_EXTENSION_USE_JSON)) return activityInfo.metaData.getBoolean(METADATA_KEY_EXTENSION_USE_JSON); final ApplicationInfo appInfo = activityInfo.applicationInfo; - if (appInfo == null) return true; - if (appInfo.metaData != null && appInfo.metaData.containsKey(METADATA_KEY_EXTENSION_USE_JSON)) - return appInfo.metaData.getBoolean(METADATA_KEY_EXTENSION_USE_JSON); - return true; + if (appInfo == null) return false; + return appInfo.metaData != null && appInfo.metaData.getBoolean(METADATA_KEY_EXTENSION_USE_JSON, false); } private static void parseEntities(final HtmlBuilder builder, final EntitySupport entities) { @@ -3879,7 +3879,7 @@ public final class Utils implements Constants, TwitterConstants { /** * Get most contrasting color * - * @param color + * @param color Input color, alpha channel will be disposed. * @return {@link Color#WHITE} or {@link Color#BLACK} * @see
Calculating Color Contrast */ diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/TwidereMenuBar.java b/twidere/src/main/java/org/mariotaku/twidere/view/TwidereMenuBar.java index ae2f86940..47748c9cc 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/view/TwidereMenuBar.java +++ b/twidere/src/main/java/org/mariotaku/twidere/view/TwidereMenuBar.java @@ -1,26 +1,46 @@ package org.mariotaku.twidere.view; import android.content.Context; +import android.graphics.PorterDuff.Mode; import android.util.AttributeSet; -import android.view.MenuInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MenuItem.OnMenuItemClickListener; import org.mariotaku.menucomponent.widget.MenuBar; -import org.mariotaku.twidere.menu.TwidereMenuInflater; +import org.mariotaku.menucomponent.widget.MenuBar.MenuBarListener; +import org.mariotaku.twidere.Constants; +import org.mariotaku.twidere.util.ThemeUtils; /** * Created by mariotaku on 14-7-29. */ -public class TwidereMenuBar extends MenuBar { +public class TwidereMenuBar extends MenuBar implements MenuBarListener, Constants { + private OnMenuItemClickListener mListener; + public TwidereMenuBar(Context context) { super(context); } public TwidereMenuBar(Context context, AttributeSet attrs) { super(context, attrs); + setMenuBarListener(this); + } + + public void setOnMenuItemClickListener(OnMenuItemClickListener listener) { + mListener = listener; } @Override - public MenuInflater getMenuInflater() { - return new TwidereMenuInflater(getContext()); + public void onPreShowMenu(Menu menu) { + final int color = ThemeUtils.getTextColorPrimary(getItemViewContext()); + final int popupColor = ThemeUtils.getTextColorPrimary(getPopupContext()); + ThemeUtils.applyColorFilterToMenuIcon(menu, color, popupColor, Mode.SRC_ATOP, + MENU_GROUP_STATUS_SHARE, MENU_GROUP_STATUS_EXTENSION); + } + + @Override + public boolean onMenuItemClick(MenuItem item) { + return mListener != null && mListener.onMenuItemClick(item); } } diff --git a/twidere/src/main/res/layout-v21/layout_home_actions_button.xml b/twidere/src/main/res/layout-v21/layout_home_actions_button.xml index e15094a47..cb32fef3a 100644 --- a/twidere/src/main/res/layout-v21/layout_home_actions_button.xml +++ b/twidere/src/main/res/layout-v21/layout_home_actions_button.xml @@ -1,6 +1,6 @@ - + - + - + - + - + - + + + \ No newline at end of file diff --git a/twidere/src/main/res/layout/layout_home_actions_button.xml b/twidere/src/main/res/layout/layout_home_actions_button.xml index 3a510ee89..866a4f019 100644 --- a/twidere/src/main/res/layout/layout_home_actions_button.xml +++ b/twidere/src/main/res/layout/layout_home_actions_button.xml @@ -1,6 +1,6 @@ Excluded Exclude this host [DOMAIN]: Twitter API domain.\nExample: https://[DOMAIN].twitter.com/ will be replaced to https://api.twitter.com/. + No version suffix \ No newline at end of file