From 52d96580385fc5e5e49e131a8d1da96febe0df58 Mon Sep 17 00:00:00 2001
From: Dan Roundhill
Date: Tue, 19 Nov 2013 09:35:02 -0800
Subject: [PATCH 01/43] Use software layerType for post content area. Fixes
text overlap issue #46.
---
res/layout/{edit.xml => activity_edit_post.xml} | 3 ++-
src/org/wordpress/android/ui/posts/EditPostActivity.java | 2 +-
2 files changed, 3 insertions(+), 2 deletions(-)
rename res/layout/{edit.xml => activity_edit_post.xml} (99%)
diff --git a/res/layout/edit.xml b/res/layout/activity_edit_post.xml
similarity index 99%
rename from res/layout/edit.xml
rename to res/layout/activity_edit_post.xml
index 1d46c0e8b178..ced372d52bec 100644
--- a/res/layout/edit.xml
+++ b/res/layout/activity_edit_post.xml
@@ -41,7 +41,8 @@
android:inputType="textMultiLine|textCapSentences|textAutoCorrect"
android:minLines="@integer/content_editor_min_lines"
android:paddingBottom="@dimen/content_edit_padding"
- android:textColorLink="#21759b" />
+ android:textColorLink="#21759b"
+ android:layerType="software" />
Date: Tue, 19 Nov 2013 10:07:00 -0800
Subject: [PATCH 02/43] Added increased line spacing in post content area.
Fixes #304. Also increased size of title EditText font to differentiate it
more.
---
res/layout/activity_edit_post.xml | 3 +++
1 file changed, 3 insertions(+)
diff --git a/res/layout/activity_edit_post.xml b/res/layout/activity_edit_post.xml
index ced372d52bec..673865efe164 100644
--- a/res/layout/activity_edit_post.xml
+++ b/res/layout/activity_edit_post.xml
@@ -29,6 +29,7 @@
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
+ android:textSize="22sp"
android:hint="@string/title"
android:inputType="textCapSentences|textAutoCorrect" />
@@ -38,6 +39,8 @@
android:layout_height="wrap_content"
android:gravity="top"
android:hint="@string/post_content"
+ android:lineSpacingExtra="4dp"
+ android:textSize="18sp"
android:inputType="textMultiLine|textCapSentences|textAutoCorrect"
android:minLines="@integer/content_editor_min_lines"
android:paddingBottom="@dimen/content_edit_padding"
From d072b06d88b8f575f22ec89290b7a9452abfb0db Mon Sep 17 00:00:00 2001
From: Dan Roundhill
Date: Tue, 19 Nov 2013 17:03:45 -0800
Subject: [PATCH 03/43] Also set text selection end, if it is valid. Fixes
#324.
---
src/org/wordpress/android/ui/posts/EditPostActivity.java | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/org/wordpress/android/ui/posts/EditPostActivity.java b/src/org/wordpress/android/ui/posts/EditPostActivity.java
index a450a10240df..eddb994df135 100644
--- a/src/org/wordpress/android/ui/posts/EditPostActivity.java
+++ b/src/org/wordpress/android/ui/posts/EditPostActivity.java
@@ -935,7 +935,9 @@ public void onClick(DialogInterface dialog, int whichButton) {
} else {
mContentEditText.setMovementMethod(ArrowKeyMovementMethod.getInstance());
- mContentEditText.setSelection(mContentEditText.getSelectionStart());
+ int selectionStart = mContentEditText.getSelectionStart();
+ if (selectionStart >= 0 && mContentEditText.getSelectionEnd() >= selectionStart);
+ mContentEditText.setSelection(selectionStart, mContentEditText.getSelectionEnd());
}
// get media gallery spans
From 58c948d79fb77596927d83a7e22bb32cc2d8fb88 Mon Sep 17 00:00:00 2001
From: Dan Roundhill
Date: Fri, 22 Nov 2013 08:58:40 -0800
Subject: [PATCH 04/43] Post editor switched to tabbed interface. New fragments
for editing post content, settings and preview.
---
AndroidManifest.xml | 2 +-
res/drawable-hdpi/ab_icon_accept.png | Bin 0 -> 708 bytes
res/drawable-hdpi/tab_icon_preview.png | Bin 0 -> 1442 bytes
res/drawable-hdpi/tab_icon_settings.png | Bin 0 -> 1434 bytes
res/drawable-hdpi/tab_icon_write.png | Bin 0 -> 1216 bytes
res/drawable-hdpi/write.png | Bin 0 -> 1216 bytes
res/drawable-mdpi/ab_icon_accept.png | Bin 0 -> 619 bytes
res/drawable-mdpi/tab_icon_preview.png | Bin 0 -> 1289 bytes
res/drawable-mdpi/tab_icon_settings.png | Bin 0 -> 1304 bytes
res/drawable-mdpi/tab_icon_write.png | Bin 0 -> 1148 bytes
res/drawable-xhdpi/ab_icon_accept.png | Bin 0 -> 908 bytes
res/drawable-xhdpi/tab_icon_preview.png | Bin 0 -> 1617 bytes
res/drawable-xhdpi/tab_icon_settings.png | Bin 0 -> 1622 bytes
res/drawable-xhdpi/tab_icon_write.png | Bin 0 -> 1304 bytes
res/drawable-xxhdpi/ab_icon_accept.png | Bin 0 -> 416 bytes
res/drawable-xxhdpi/tab_icon_preview.png | Bin 0 -> 1971 bytes
res/drawable-xxhdpi/tab_icon_settings.png | Bin 0 -> 1880 bytes
res/drawable-xxhdpi/tab_icon_write.png | Bin 0 -> 1372 bytes
res/layout/activity_new_edit_post.xml | 6 +
res/layout/edit_post_content_action_bar.xml | 20 +
res/layout/fragment_edit_post_content.xml | 143 ++
res/layout/fragment_edit_post_settings.xml | 183 ++
res/layout/fragment_new_edit_post.xml | 16 +
res/layout/row_post_page.xml | 1 -
res/menu/{edit.xml => edit_post.xml} | 0
res/menu/new_edit_post.xml | 9 +
res/values/strings.xml | 4 +-
src/org/wordpress/android/WordPressDB.java | 2 +-
src/org/wordpress/android/models/Post.java | 33 +-
.../android/ui/media/MediaUtils.java | 146 +-
.../android/ui/posts/EditPostActivity.java | 6 +-
.../ui/posts/EditPostContentFragment.java | 1479 +++++++++++++++++
.../ui/posts/EditPostSettingsFragment.java | 658 ++++++++
.../android/ui/posts/NewEditPostActivity.java | 333 ++++
.../android/ui/posts/PostsActivity.java | 12 +-
.../android/ui/posts/PostsListFragment.java | 10 +-
36 files changed, 3040 insertions(+), 23 deletions(-)
create mode 100644 res/drawable-hdpi/ab_icon_accept.png
create mode 100644 res/drawable-hdpi/tab_icon_preview.png
create mode 100644 res/drawable-hdpi/tab_icon_settings.png
create mode 100644 res/drawable-hdpi/tab_icon_write.png
create mode 100644 res/drawable-hdpi/write.png
create mode 100644 res/drawable-mdpi/ab_icon_accept.png
create mode 100644 res/drawable-mdpi/tab_icon_preview.png
create mode 100644 res/drawable-mdpi/tab_icon_settings.png
create mode 100644 res/drawable-mdpi/tab_icon_write.png
create mode 100644 res/drawable-xhdpi/ab_icon_accept.png
create mode 100644 res/drawable-xhdpi/tab_icon_preview.png
create mode 100644 res/drawable-xhdpi/tab_icon_settings.png
create mode 100644 res/drawable-xhdpi/tab_icon_write.png
create mode 100644 res/drawable-xxhdpi/ab_icon_accept.png
create mode 100644 res/drawable-xxhdpi/tab_icon_preview.png
create mode 100644 res/drawable-xxhdpi/tab_icon_settings.png
create mode 100644 res/drawable-xxhdpi/tab_icon_write.png
create mode 100644 res/layout/activity_new_edit_post.xml
create mode 100644 res/layout/edit_post_content_action_bar.xml
create mode 100644 res/layout/fragment_edit_post_content.xml
create mode 100644 res/layout/fragment_edit_post_settings.xml
create mode 100644 res/layout/fragment_new_edit_post.xml
rename res/menu/{edit.xml => edit_post.xml} (100%)
create mode 100644 res/menu/new_edit_post.xml
create mode 100644 src/org/wordpress/android/ui/posts/EditPostContentFragment.java
create mode 100644 src/org/wordpress/android/ui/posts/EditPostSettingsFragment.java
create mode 100644 src/org/wordpress/android/ui/posts/NewEditPostActivity.java
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index f46d6c7c1aec..5bc7399c426b 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -101,7 +101,7 @@
android:label="@string/create_a_link"
android:theme="@style/WordPress.Dialog" />
diff --git a/res/drawable-hdpi/ab_icon_accept.png b/res/drawable-hdpi/ab_icon_accept.png
new file mode 100644
index 0000000000000000000000000000000000000000..0332a2f2deec56c9d7d0c8cf2b500b08921c4b1d
GIT binary patch
literal 708
zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCmUKs7M+SzC{oH>NS%G}U;vjb?
zhIQv;UIIA^$sR$z3=CCj3=9n|3=F@3LJcn%7)pVryh>nTu$sZZAYL$MSD+10f-TA0
z-G$*l2rk&Wd@@jkv%n*=7)X17vD?XPJD~AXJY5_^GVZ;dVefa?K%{;C-E{?wVtfrp
z8jc7~uwd%woH)_hppZjCi;YbzOwF&sA&EWjK!8TQ9a~)J=^aOXm;4a@Gg(JFaLV`E
zzQ-+*HCKv?zvY)!+o}STQ4wgn5G?=v$eD9UFO1x-~26wj!r+d;s@Uc
z#yw9xA{wW26qtu6vDK8v-><3wI`do!j#><{m2EKnzkb+Z2ssA{XUS%`NJ(bR&d7jliTiB
za0^WQlD3AkQB&xWX^nPc%aJF`!oC}1X92;#n0*W;OJ|laSy}A|MwDuaYeY#(Vo9o1
za#1RfVlXl=G}bjV)HN^(F|@EUGO{u>(>1WLGB9A;zF;|uhTQy=%(P0}8j4>@NCP!U
uf@}!RPb(=;EJ|f?Ovz75Rq)JBOiv9;O-!jQJedkgO$?r{elF{r5}E*ES_(P<
literal 0
HcmV?d00001
diff --git a/res/drawable-hdpi/tab_icon_preview.png b/res/drawable-hdpi/tab_icon_preview.png
new file mode 100644
index 0000000000000000000000000000000000000000..af0c31de8ac30295b5277df9c0af7447edccb3e8
GIT binary patch
literal 1442
zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O`
z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y
zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP
zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4
zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y-fM)1rW~NvfS(sWlI=L8`IGGw68oC-gT3A@P7&=>8x|tYR
zxLTON^t$9Hm*%GCmB93-AoLpJ)C)=sxdlL*T~doO%TiO^it=+6z@E0s#O)RXoaRCG
zrr>sqAx^#eK*#8Vq82HtVM4(417gAxE|3FH`l)%q^j-u^*y4$a5ey7WBAzaeAr-gY
z%!v0plT>M#$R5@h^*Z=YW(vwCJ%PmwXIzuoHRIvE!@MVyzA1dxEtoZv^XI&`C7ikz
zi)T)-XwA33PI@5|
zw9G0^xc8$&^5UA~TdqxuIlLt73|HV+&zTG5G?$Cqj64u<*{}Zk@_Q8>?NzRJi7nd=
oT~6QEVp3p$qyH=qyc-x9nkM{Z=2X6P22^T#y85}Sb4q9e0Db}l_W%F@
literal 0
HcmV?d00001
diff --git a/res/drawable-hdpi/tab_icon_settings.png b/res/drawable-hdpi/tab_icon_settings.png
new file mode 100644
index 0000000000000000000000000000000000000000..c87ae4391177bfa18de9ad0d60c80de1c8d5b61a
GIT binary patch
literal 1434
zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O`
z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y
zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP
zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4
zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y-fM)1rW~Nv<8#|ksIvW|AIGF;&-PPF9!otGE(Am<`&BVyU
z)xrd(*Cju>G&eP`1g19yq1ObbUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZnqfXG!Lpb
z1-Dy_aO%|uIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1zUJ=2vnt_3d$J50zq~g|_
zNbkI60|DPf>xvom0=|jvW%#}2&0?7aC-*&KSn=EB?sq1Sn~UFc@AB7wzmTWIABRsKi*<4iS3f&jaV&CM?(P|zb(tF-6a+X}+QbU|MU&?jD@-W(AJAhPus>((
zjGa4$PIMHmG2NuBK7reh_1}@dXH%0m7*61i3o6oQd7J)Wci5WrJK7P)Sw3tuSl&=r
z#I!T1UF(F6VbN!=2<7N>-$T;WoIhUIDEqxRk*|4{yUOkB?$*9tZ*!T?e{g!hlTfm9Qx>JO0=8_PhUv96&KflafqH!xQv}-*_bHC!`gG)}ml(L-f+uLyd
ziWOI*d%I9o5X-xX3xc$mcIiy`{-lW-_MG2K|M)t7dxWzYiQ;dD-<$JPa?3kM6(o_19NWY3b?e=d#Wzp$PyA_XHdO
literal 0
HcmV?d00001
diff --git a/res/drawable-hdpi/tab_icon_write.png b/res/drawable-hdpi/tab_icon_write.png
new file mode 100644
index 0000000000000000000000000000000000000000..e48b544ba0f2da361338cb5cbf28756a3605b02f
GIT binary patch
literal 1216
zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O`
z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y
zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP
zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4
zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y-fM)1rW~NxVnm8J`x|o`qIGMN^8oC-gT3A@P7&=>8x|tYR
zxLTON^t$9Hm*%GCmB93-AoN<`)C)=sxdlL*T~doO%TiO^it=+6z@E0s#O)SSoaRCG
zrr>sq8BV?WK*#8Vq82HtVM4(417gAxE|3FH`l)%q^j-u^*sWqh&lngOjXYf(Ln>~)
znR$@+kO7ZtaJO-FiA+&Cli3S~yA7rHQl4`D%z4$u{L&Tb&H0KBT=Rt$H!jW32ytKqqJPm3ln*eZ
X@+^8&zghA*s7^>bP0l+XkKuO*(^
literal 0
HcmV?d00001
diff --git a/res/drawable-hdpi/write.png b/res/drawable-hdpi/write.png
new file mode 100644
index 0000000000000000000000000000000000000000..3693d1409d843b674f27d10f7d9c5358363b5f0e
GIT binary patch
literal 1216
zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O`
z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y
zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP
zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4
zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y-fM)1rW~NxVnm8J`x|kZ9IGMN^8oC-gT3A@P7&=>8x|tYR
zxLTON^t$9Hm*%GCmB93-AoQBx)C)=sxdlL*T~doO%TiO^it=+6z@E0s#O)SCoaRCG
zrr>sq5l+4OK*#8Vq82HtVM4(417gAxE|3FH`l)%q^j-u^*jY+n9y2g78hN@nhE&{o
zGxH$tAp;)Q;BMpU5}BfOCbJg|cNI6Oagv1$Y7J@F_eiHEB_7=-^EHjR38
zgvFlyy4j>1xql~p;9YV+|Aqyl@}BtSTfzr;_OGwZuhqRPtiW(Dy-sf;gW`ub{F|gc
z1b^sG31VHC{zHms&4&oavWlJtjvqmch96X!7Ck6t?Q=^K`!Of;%k8=R%TKmS*|{sE
zs%&FV@O@CMRKg;E-XP_Jse5O@BPZ7QDy7YgB|3>p50-tHp`6<1VqB5avZnjQ`Yg8i
zWd0*U!mc@4|Fs=w{oK)Zq&(&Pne(cR`K2q=oAVVNxaJEhZd{t55#qoKME{~6C?8-*
XgTe~DWM4foBf}f
literal 0
HcmV?d00001
diff --git a/res/drawable-mdpi/ab_icon_accept.png b/res/drawable-mdpi/ab_icon_accept.png
new file mode 100644
index 0000000000000000000000000000000000000000..d1a9832153b2c6bc3eecb68302a9c8ccb327ba25
GIT binary patch
literal 619
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmUKs7M+SzC{oH>NS%G}U;vjb?
zhIQv;UV>C6dj$D1FjT2AFf_CjA5L~c#`DCC7XMsm#F_88EW4Dvpc0l8;JzX3_A`ZWuw%6;3gFr)i(Z-E78@F8z
z+hBk2l;0P|8ZK*Zc_;1YkBlzszSnd=&e2`_=XCnRHXLl>O@AmGeEjLLBWn6}wtA+rV7pz#tX>aJ9sI5nzijJ&{&!qUkKRi8&HSTl{rxL}
zOsjAEeEhKHw{XH?dCC8UA~ucZ)?AP^IH$U(ZnypJ+XwD&o!d9@!o3GGJto~)HIbwF
zw{3v>#81Xl{>kB^^Ia(i-RuN-c*KpmSqW6f}
zhXkSag&(9kWgjf?uXw!mh^YT|={I|WLK&^@=0(-c^jy)gN1xjzc5R!)qwSBFTaIlu
zoBLqnJYaaLmbgZgq$HN4S|t~y0x1R~14Cn7LqlBylMq7-Dl3^w)^1&PVosU-?Y
zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP
zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4
zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y-fM)1rW~Nw~I2yT{8krcHIGGw68oC-gT3A@P7&=>8x|tYR
zxLTON^t$9Hm*%GCmB93-AoLpH)C)=sxdlL*T~doO%TiO^it=+6z@E0s#Nrks3sVb6
zCl?c(=0WwQ;C71vPQCg-$LNEi7AdM>LcsI`V!{(HkONQpsd>QkUIa|ozY^2^85kI=
zJzX3_DsH_AGxR&`AW-sRC%=sR2lg}Ue;6+*e|LGQ{9WNYN7WNMG20@3ulF?y@&^0{
zyD!Z#v9h$A%yRLL=VF!J<<*a8-Yyn9Y@qVrQf#7wiU6kzle)kOmhC@E9!Fo`v}290
zcU>T$!y0yhoA1V(s0mD*Nzn(7FXfPMY*oM3d!J#tx4?FViuN6oD!7aSn1nr8*Cwd1
zU}5{Xbb(vU$F7}uy{E5kNfQa?TCqf5*?)1^8uw?bxwPl7HgDCeTR&lbZsV!Q#S^M_
zE{yTM^xOGwy+U=?l^~(-$=vJuL{_x*LFqOp6K}2l%F=$hLjlraSF%`-dUw6Q
zuu3mq<9<+epOTBi#Om@!?Tm@1_wIaO!hR#*@6PazjY}*euLPctJ~7wnRh!P97pFB?
zJA2;Ml^1-kkTl)@a!zsF@ngyY|0lRG0mG=^(htD|hAOuMgp_K+r>mdKI;Vst
E0ARAirT_o{
literal 0
HcmV?d00001
diff --git a/res/drawable-mdpi/tab_icon_settings.png b/res/drawable-mdpi/tab_icon_settings.png
new file mode 100644
index 0000000000000000000000000000000000000000..1c0ea22aa4bb7b87a8e1685467657a20157357dc
GIT binary patch
literal 1304
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O`
z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y
zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP
zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4
zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y-fM)1rW~Nv<8#|ksIvbgrIGF;&-PPF9!otGE(Am<`&BVyU
z)xrd(*Cju>G&eP`1g19yq1OVZUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZnv1?G!Lpb
z1-DzwaO%|uIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1zcF%dVj)8%(%hSa%q~g|_
z@V$PA4FvK8v@09;Is9cxbiXNhceO$DCS^H>)aU8zcZuIv{4V6pOYSeMXP8?ymrV7W
zc0S#D(ZmM-Uu{XRoL?rONq`2XzM`@d!|`F!X#Eo0BAU&=1>
z;poI7PSFo>v!-ySW;EF+f8e_uqcqjDoc|BQJ|^yj-pAPwoVysLYBVAQkAFH~ca&M}
z>GqXRT|aQdESq(qCzUF)JgD?i8Hb;l6*BG
zE&9mLt$x~}j=j4d7APMl@_sX=@YxfcID@_S&J{S=SlEa%wP^b;Gf`nOiN~QP6O+?zyrKN
zKa*N!7`V%?QPyADHRa)g=#AT&+86yknZ2{@O4;;H0pI@T{&>z>!)?IeKk?+gxm#C$
P0+m&su6{1-oD!Ml3^w)^1&PVosU-?Y
zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP
zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4
zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y-fM)1rW~NvfxEWd)Ia<1!IGF;&-PPF9!otGE(Am<`&BVyU
z)xrd(*Cju>G&eP`1g19yq1O$kUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZnrq&G!Lpb
z1-DyVaO%|uIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1zp0sgiJ}^_f^K@|xskoK&
z=l_5E!wyVpZH#P-`6SBtRx~9oV&tBx%kT7P`$c1x3%dMDW-2pQtKAkvyfp^
zr%bb0t&P;SYUDX{aoQ=IQ@s5=ph2JOoWjP7yzHzyxvvPOMEiMpcC6J{dZQ>P`>=ve
zPM40lD%S?aF5Trz%$9ULZE;H25^49UVd6uE1_ow^>U9fk-F9A^3n~vhUHx3vIVCg!
E0C!lvI6;x#X;^)
z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV
z+ueoXKL{?^yL>WGgtNdSvKUBvfU(=jY&!-9rWj8b$B>F!Z)cs&5^)r1U0uba!sRG#
zcw~Y81YePlhDtv;D(49Zok-ph_=Wd~ug9iKb2}6soeJ$pnRIgc(GbJyo2s(vs#bUv
z@|zeRHnIIa=e>`=>fK{2LbRrOEe%>3q7}-@Bz0id^OJvb-!)nr=){{Hn=$*pkiA
zzIn{Dr)J+bIi@pH@s65MkSx=aYsLNN8}knYeyDp_C@yutHt`?3vMhu4r#S(wQ785@
z)LA~ReQ?S4{@346=T!?beo=a|{w~`Gu?XfIQC^M{=I;ulCrp2KpZWV;yKP;?4o|H2
z^VM|D_|Id*)pW|XPW{-@g}x8YNbVDQ=HH-xbp}7vgeU#VPy8Fx5B^mA{$sAh{3(Cj
zOrJF~OxZIj{FCI#-^{yNj~<#f#dVUn^G%Mqes()DJ{=6;Zw!ysH|kQ+XZ!qQdSm~A
z_yl!{ie-*ns`_kO@-`elVC}Yx;a-d489|50Cr2Cp9WJ}8P-}R_@#B;
zv%KLnYOb6WVDnQfh|NNzrG`V;{NcF?{X9DLOyARUn=IPQL)3m6D*i}Zmgl5$X2KqO
zzq(JI0zgj7pH&L=Pt6+EAD!UeV&E`rRt?ITA0aReY*5H03yvFYaq6=(LK{nrHpFAGf|opE$pD%{kdaJJkL#+J!m-
zrPgqo_n53`s!?j$rWOgkImk9(Of027>QiEBhjN@7W>RdP`(
zkYX@0Ff`URG}JXP2{E*=GBUC%X8O-xS>N=;0uEIgSC$`uTru6{1-oD!Mc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn
zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87
z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$
zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`f(~1RD^r68eAMwS&*t9
zlvO-#2=9ZF3nBND}m`vLFjeEsTY(OatnYqyQCInmZhe+73JqDfIV%MiQ6sCIL(9V
zO~LIJ7o2+afsWA!MJ-ZP!-Rn82gHOYTp$OY^i%VI>AeV;u>Tu>?qFbGI_&A<7*cWT
z&8*Y8ha3djcu$#{JYaKT4tcYC?D7m40U*$W8_ceCxvD4}<6b3SIIWTH4ur6Q_X3(lq&yvWU%5hKSwYIHoi7FnL$$b_JT~X~el6YrU{B)&2YLP=+&Y={--AqI@UM
zV%(r~e#73xhf0yV7&fRdY`ZG%b0@CIIi=FeO>R=d`!ffO=V`8~V>!?;rGJJ+J)7aa
z)HRX@ahsXrwxz7gUlDajq#^L%)XwtF6UE(rc1&5X#rBA$<;XP7t;YmrF;%2b@jvl4
zm-FT4($k8cS`-g%e{Y^C#P_$&&^|?H8{_JWk7H}Z-9C<=<9Z75FNBL?-;xG^d^2(MP_sSG*TBN!lH4;9+|#D8
zOufFVcSbRT_$}!IJBemy?;ztVLC^l>pZOcSQ1Ek|OrL|!qJ^y{x|5dKW!xyr$f}(F
znPH1%W{ard@gx&Nrwem@+G2cLmMnDjIk{$C_pBwqj;Ms2vwxnfU(kor|A;#6RTjC=9S;bH2)Omh(RggLPnE
z(`*0ag$XZBcKoY*5L@*t|6^Y_aza8*RlC&hGx0FQ?7y=5Bm?(fP$BQ>>gTe~DWM4f
Dt3X*v
literal 0
HcmV?d00001
diff --git a/res/drawable-xhdpi/tab_icon_settings.png b/res/drawable-xhdpi/tab_icon_settings.png
new file mode 100644
index 0000000000000000000000000000000000000000..614bf19a5aae0d955086ee5c30abb43a44f3979f
GIT binary patch
literal 1622
zcmaJ>drT8|9KTWqOh9o%1ra^ZsXXNRF6~LRwZ|*7fTe~`+1$|{^epWi*MpV{2_Pfr
zT*R5V;DhNDA0+A~NCY*j0Uv0lj2J~0um*et9U32Cr;=R}*#3}R?(X;fee?Z%zK`E0
zzbzSQ$-&d+P6GfSI5h>;va8bj1^BW52BM&kUBa0}J(Ef1GIor{0hN)=!NF7umWOL`
z%vfB|fhPa}_cKDLXY`uYh=H`gm^TJ?SSS_^00}D{6lO5v448xG5mp8C^z3gCNEj7R
zmPEtXP-@&nq&R6j)0w6-IL!vR5n8zdOmHA9fdywU&|%59+7O2V8skM++w0~*;8+M_
zRzUBI(rYq6HA&;31Qx{^_yPeamBIqCL@E_51BHBnkjH0VX`DceNTi4`9vpulHXCis
zMYL$rcrJFQfJ_WSAv~VlZinq6n56S~0=Zo7%Hb#s8Tki*n
zZMtF#=V@^pSx6h$gUemyO+_JU8pjxt){$iX#1u13BtzOvBn7H7rC^i>GZ0p
z(IBZ-8-rO5cq*!ZSPqyVj0itTAQP%oQt>JYJNHD9N+y$`0<~P8Bo@jNW#S1eN*W3+
zxRsf}8dm?+Y&hfX|gwRHbwDJlV6{x>*@gHD};f
zc3HNo6or*Pb(aos+lLk{0P5{e`sf9*iaFIk)Xf94fdwwC{#P{Qm+g1_t0Rf~6%R{9
z%ilbOhfmy&4R7=q2Oa=2V0szX4Q#u!WOiK(Z~e`JlJ(7-uL1rpPFQH!{``p75-ia1
z6>lq8=*(&kZ~F1nEWdr}{P-6&jTahT#9x~WcD~3tIx6U|d)eBQpZ6M19OZI3-2ELM
z#CKyXweIky0k`|(p+9yFcZC=^jC@0>=h)A!%BQo0*LPHa+_KBX>z4$nazmrQi*HOT
z4_96AHH~x}>g$Mq=UO2@xhmil$7e877jQ&|${
z&?lnOOED@WbpA(?cPp-%8y7bz!NB>J!txeZOZ3q;QUAHk?hz`0`+I(qtng9(fY8*MP!cZ(6#GV9%t_3<@o?b
zeKj*8fm`Kw4{%-U_zW=f`QOwdV15u0Y(d;z+KwZYWKk5Q_g?U6%hL1Q&s-OV_|;WoEva+VcDrK*HxzUU={8e-JU(a^F!X2FW+9}
z{(RW8cE(bTsCMN0-iVv;W>!9FZ997mb~T!6%Mvc0@Xt8@Y;|kAQg~!A-CJ
zYB-r0rZU=3iQKI?H~q
zdIiQDk8m(?yQ7vV)7!JL)nI?;jm#Fv=+tFAPZ+6x)Xj0s9+f74d%LOMktQaqy8Ya(
iUU`kH>}A`iZx|pRa+Sx@X|KFDeQIJFdScbr75@M&J7RDE
literal 0
HcmV?d00001
diff --git a/res/drawable-xhdpi/tab_icon_write.png b/res/drawable-xhdpi/tab_icon_write.png
new file mode 100644
index 0000000000000000000000000000000000000000..e1f2b9958bc8b98e3cbe77a3a0eaf1aad3db7564
GIT binary patch
literal 1304
zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=k|nMYCBgY=CFO}lsSJ)O`AMk?
zp1FzXsX?iUDV2pMQ*9U+m{l@EB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+*
zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn
zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87
z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$
zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`f(~1RD^r68eAMwS&*t9
zlvO-#bun=>aWZi;G;}p~w6L&nF?6=HbTcus
zaJ4Xj>2=9ZF3nBND}m`vf$KFjz^NCM7;+1MHoK%2WtOF;xE1B+Du6w0m5IeImM+GI
zj;_XLK=WL&y9J^*1*cm~TyeTZALtl;P}CwtHB1PYen3ok!Ub~RNk26YnBI$k30p3K
zKbL`lvCGrNF{I+wo0*NgO$Gw4R}CgNm+-hJFdR!1c5TfGl%Kg14W@3
zEKd&1_D&F-(DZ(JvV&*FiHFGte%c;PDp@g?@oiiEcGr|cXF2~wwPYN6qQ<=K&|$ZB
zDW<+dv&D`bQ{0o8s56uC+6T4LC(k7Ao%Io5%{S^=z#4FPG3$lH%B(vY+&K%F`vo3w
z-HU3luJC5md$^WmN9%Th30Y4*f3DncSbi?o`n`+piPtS|wx7hfGrQvM7g^Omag3I|
zJ?|_1BpuoJhab@1JTbbgeAR*Iy?o21Zo0-kn#~#VLG>DQ5~pSBMvXmF8{$`Q+Snqo
z!)i||?}^MGQHg7q@^uqdx4in$A+@1=@**yqRUFGy0>1nVT6`deN%fD!iQb75ES5LA
zi#YzWi?330;f;4@5Ut5%EcxJmjrpINiUSie@{`JEWMg=pZuRP~%*s|!S>@^K=d#Wz
Gp$PyOQ^89B
literal 0
HcmV?d00001
diff --git a/res/drawable-xxhdpi/ab_icon_accept.png b/res/drawable-xxhdpi/ab_icon_accept.png
new file mode 100644
index 0000000000000000000000000000000000000000..dbf82aa8abdc2a65102ee8e904b73e029d0ee27f
GIT binary patch
literal 416
zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGok|nMYCBgY=CFO}lsSJ)O`AMk?
zp1FzXsX?iUDV2pMQ*9U+7@a&_978H@y}9Gad&oh8^d`w6&e@>92hth7{I~}
zwH5&%q%WKBelAW`Qm=n_%)@UV2kVpW0Ed5vX0Dv`r&06M$>U|8{NqpTH`qG=Poe9+
zVE&&^nrl8e+Wl0RUo*kq?u5Ghlga9O-WY`y0_x)nxZ;tpo`<9>o
zt^8ZsUBON@`)<;@{NC*AUqT)iHCl6|Jv58aY22A)uYxQ#S$3K
Xc7+^#?yRtr0SG)@{an^LB{Ts5Lff0K
literal 0
HcmV?d00001
diff --git a/res/drawable-xxhdpi/tab_icon_preview.png b/res/drawable-xxhdpi/tab_icon_preview.png
new file mode 100644
index 0000000000000000000000000000000000000000..a737e1e9eb956c3648b0bdd3fc4336993b2943b9
GIT binary patch
literal 1971
zcmah|eLPcZ96uWqN>SX3Tb<_RlVr1*wXIfTqb*HHmr7-}V^(cvZD*N6Qi$s!(T%#j
z_{6Q7B-OoMdNZX+_(b&LCcRA3$8?)6rMhQA_Yb#wKIeCy=l7i7_xt<)p6Buh
zFt;@a0KkIB4I3TV}KzaZiE%|f~ezjO(>Sj|8Qq!1zi)zU38B}2``5A!n6xnY@z2ZuwD
z%}o3kQ6YSPkPRy!(1YOaDs&@}Kq{3$qIgiLqy-?^jYKB8p)b{yL}7SP8RUiF$b(0-
zDMS&BK#tEyF4SYK
zLSOZcORNlvmP5oqNC~SHLiFGw>q9cM-xX+Mhg7{;0|3U3
zJdS6O`r+$e__9ZCmWkcR9=*p_uvC~X?3MV-Q(9u5#Xcz#B0A(KxT6dG5rfeJ_i!yn
zWq1Y$XY?*D|2UVf!*KTFGYkIS=UzR>aesAZ*fDiQ0uH@!mZ%w{h5-Q9|G4si_vF$K
zcMiR~C}}Q)&V2sde4#_%KN~=vuQ;-=`_sl#zZI_80+D*lwTM3;}TPS~JJ+xdgvfw=27llEq@
zT7EXU#?%uFvyr5w#_6>)Rq=Fp+uo!)3pQ}8c1X$8<*s#od85s`CLOA!@J@9DMY%g3
zHeK|wxVC!XAL7|TQ+E_}KBHxCnQ1Ab42gVRr1!$vz=4+AezkY2*F@-x7BwVPYSz2Y
zb)L7!A8^oq4)aQPKzI&jj+-M0Qzvq2C3X1&4~u@7WgE0%eDydrNAv4wdAY?JN!t|CsGFM4~;pyMAoVZ*&cNvqM)7-9aFYhsmU-$H)rtE0xCeMM;8f;&kKE3^AZ%<98
z-HVA@@$ct=vd3@0gZD-DCi2F#zoZ=jj~ANha%a00Bxk;IEjhlvbzoxQrunBdKW<1;
zK-!|}*Cf5uUhBU4!yV<%>RPJAnziSb+0D@OTs!~13RT(J8hzsY&0kqs7*{B1cr^hB
z?gAf7e<$GXaA`8%e)ajMmX&^?IJLipX-4YhdR^K*bM0xJRWj{JF{UcR=`>}&G*z37
zZNg~+!yXskWVX+UYaDbuFz9!DrT0K8UYKPcyz)b-f7W%EirM14nv|cOW4Or!Mg-n6O`*-~p7SPmYT7p9*_r`x+K^2_nTFVdUd4FSK-5f8
g!+z5ZY~6@40jxCq2H$f|x6p8a=k3QS_6ke*2lSBs`~Uy|
literal 0
HcmV?d00001
diff --git a/res/drawable-xxhdpi/tab_icon_settings.png b/res/drawable-xxhdpi/tab_icon_settings.png
new file mode 100644
index 0000000000000000000000000000000000000000..f567be265cee4361139765e09c4629c3bcdda891
GIT binary patch
literal 1880
zcmaJ?c~BEq7~h1HQxT7fqT&+4gF-GyNKzssgi8&^5GyJuVY9%B$!?QH0*Iy(BiJfn
zMNtQb!4|wK%xFDOAtKbOQBbTXwt^Q5Sf~b}qS$T_)IUmhcK5ya&G-9#_q<$bRQOm&
zH%9;f#zsbnWyBh9{p@Xt|HGm*F0o9-Lu2r0G!aizXkb97L=#{zQl&_OWw1h-{`F-z
z5CCjE5qS(ABU!|UP!&yK)uHKB7=Z?Wz#tu_fKp%_On{RRwSd}lwuTBKN&$5lTf&fF
zA#gGhk)eU3Gos{BMhe7JQiJA$fjT}xpn`D)s8g*~Yxz0>b%>Ww?5$!t6&zB*Qv}ra
zPQ^&1U
z#9_m>h?9VtjN=%ePESiqqow)LP)!n@$>Z^?94wYEq2a4dSK|tuuUb26gh32zAq|4z
z2&x9HjEV#_6&FwmPv3{2!amTdwZmy55=Pf4FglaQu!c0ED3ScXs!H`iTZ_x!kN*BA
zu~wdr!E_m{MN>5pQMkleR#O;1L<1{uR3k^xwIf-SCZjm2O-3;=B$@-xl_(%YZ57NL
zLP#Y1NVOJMs3AB~ET9q`Gz3xd8DUH=ODJUdi`YcoL;ZwYE?3M9;qk)!S=>;r{|Hu$
zLa8cPjgMfJAF+O;Vy(@f!U)S^Sc9yCm0=oG1r7zxM@ILBF)H6MRyn#a%u%s)!Wp`?
zw4aoEL`3wDb^D=liNlB1ht)*CYlz0~eX^BD%*&NXu~4pSd0xC&-4Z;d-tHFLwZzW!
zW~+@n7QDMmDJjgVC!GcyyGox&R-MWKR-1UirvcXzcf{vR&Xl~TnU+iGi`~4In2P$L
z>OHU9#~rY|K6(&yYa)|DU@Ks+rvl^>dp$6B=s15{wI^P2_ORL4eYG5}cMBd5kffAg
zKt2g@Ke8jV`*POO+ab@5$FA)=d*n*P;hhdeHB%RiJ$S8oul&ip+PxT3y?Za?WuFY-%}PQ0?U?ta9z;
zVwU>M@SA}86~|b5Du%SPOgMvO*ya#&!@15lMtE!e;|N`jOWn2ba;lL+N|^6vl7c34
zKdHo+KWEK`T>n;AeR?gFy-3kSUDa;mPN`U0?&E0b2;{sAU>kqSJ(t@y=sH*1cvq_W
z<#_&!H;2!~oS3sP+B5j5)TPnmSyZJ*>q<`hz>A=rX7e;3Ln+C}VD3qIxa9JpjSH?X
z)Y-IUG|A%bd=DCa08aP0b2dG)%PL;Iy*azrIKZim+qK&~eU0gM9ftT`JKw+gj+ax_
zOHzD!<=~?p(+$gNd0@c6pr#l&vzeOX!9`eL;ESOor0CwoGvF)TYi8^)f}k
ztB!&{QA<&3N{#si{J!PxD@%8bWWi$KPyR9M>Ibxp}~nj&(iAZiNh$(ju5C
zB-O2b>qS8`?YR@2eTby6dA
RW?JvM$j~V9F;V=ce*si<+G79!
literal 0
HcmV?d00001
diff --git a/res/drawable-xxhdpi/tab_icon_write.png b/res/drawable-xxhdpi/tab_icon_write.png
new file mode 100644
index 0000000000000000000000000000000000000000..898a434c65bd0c24e9d0444bb0fd2f0108863138
GIT binary patch
literal 1372
zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGok|nMYCBgY=CFO}lsSJ)O`AMk?
zp1FzXsX?iUDV2pMQ*9U+m{l@EB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+*
zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn
zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87
z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$
zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`f(~1RD^r68eAMwS&*t9
zlvO-#2=9ZF3nBND}m`vLFhHXsTY(OatnYqyQCInmZhe+73JqDfIV%MiQ6rPIL(9V
zO~LIJBb<8mfsWA!MJ-ZP!-Rn82gHOYTp$OY^i%VI>AeV;u-^vDu4G_fJm=}+7*cWT
z&0TN5!wv$jfiX#*H~({G`MXUsI?U6t`}Ni5(?m3zC0eUf?)3UtocsJIsU%qin3;h2
zQUaVu8yI1n42yqt3<_QK-(?ye{8%ZFlkvxd!_1$Fw2#V+ar|+Y&GtQVzo0&GPxc=VhWiZxc6DDQ
zHwZ0s{iAdGLhSx?9`f;}ydN4mR3B;UAF>uabtHU!Q`w)3(JOyQPFtvLe|~w)AD!O}
z^QG)ByPZ)#c7B`ix6F_0fBJo^Q<}D74x@0m^<0KqN7i#((5f?SDEp|*xTPnabwTc*
zY`%Z9wbB_Fco-NA7#I!!qktKO
diff --git a/res/layout/edit_post_content_action_bar.xml b/res/layout/edit_post_content_action_bar.xml
new file mode 100644
index 000000000000..51576cc96159
--- /dev/null
+++ b/res/layout/edit_post_content_action_bar.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/fragment_edit_post_content.xml b/res/layout/fragment_edit_post_content.xml
new file mode 100644
index 000000000000..321cdb10e8b1
--- /dev/null
+++ b/res/layout/fragment_edit_post_content.xml
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/fragment_edit_post_settings.xml b/res/layout/fragment_edit_post_settings.xml
new file mode 100644
index 000000000000..708a0c10faa2
--- /dev/null
+++ b/res/layout/fragment_edit_post_settings.xml
@@ -0,0 +1,183 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/fragment_new_edit_post.xml b/res/layout/fragment_new_edit_post.xml
new file mode 100644
index 000000000000..5c57063346d5
--- /dev/null
+++ b/res/layout/fragment_new_edit_post.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/res/layout/row_post_page.xml b/res/layout/row_post_page.xml
index ccc883a123ac..cd16a0536bba 100644
--- a/res/layout/row_post_page.xml
+++ b/res/layout/row_post_page.xml
@@ -34,7 +34,6 @@
android:layout_height="wrap_content"
android:textColor="#777777"
android:textSize="12sp"
- android:text="@string/publish"
android:gravity="right" />
diff --git a/res/menu/edit.xml b/res/menu/edit_post.xml
similarity index 100%
rename from res/menu/edit.xml
rename to res/menu/edit_post.xml
diff --git a/res/menu/new_edit_post.xml b/res/menu/new_edit_post.xml
new file mode 100644
index 000000000000..8f777657b055
--- /dev/null
+++ b/res/menu/new_edit_post.xml
@@ -0,0 +1,9 @@
+
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 843352b8237d..e9a9041a6f14 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -55,7 +55,7 @@
Save
Add
Selected categories:
- Publish?
+ Publish
Add Blog
Play notification sound
Vibrate
@@ -809,6 +809,8 @@
Create Account
SWIPE TO CONTINUE
Tap to start using WordPress
+ DONE
+ Post Settings
- Public
diff --git a/src/org/wordpress/android/WordPressDB.java b/src/org/wordpress/android/WordPressDB.java
index 50d05104931f..dcac148604c6 100644
--- a/src/org/wordpress/android/WordPressDB.java
+++ b/src/org/wordpress/android/WordPressDB.java
@@ -296,7 +296,7 @@ private void migrateDrafts() {
c.getString(6), 0, 0, true, "", false, false);
post.setLocalDraft(true);
post.setPost_status("localdraft");
- post.setPage(true);
+ post.setIsPage(true);
savePost(post, c.getInt(0));
}
c.moveToNext();
diff --git a/src/org/wordpress/android/models/Post.java b/src/org/wordpress/android/models/Post.java
index 06d9a217ac20..96d4ff2c60a6 100644
--- a/src/org/wordpress/android/models/Post.java
+++ b/src/org/wordpress/android/models/Post.java
@@ -2,6 +2,7 @@
import android.util.Log;
+import java.util.Date;
import java.util.List;
import java.util.Vector;
@@ -10,6 +11,7 @@
import org.wordpress.android.WordPress;
import org.wordpress.android.util.StringUtils;
+import org.wordpress.android.util.WPHtml;
public class Post {
@@ -49,7 +51,6 @@ public class Post {
private Blog blog;
public List imageUrl = new Vector();
- List selectedCategories = new Vector();
public Post(int blog_id, long post_id, boolean isPage) {
// load an existing post
@@ -98,6 +99,12 @@ public Post(int blog_id, long post_id, boolean isPage) {
}
}
+ public Post(int blogId, boolean isPage) {
+ // creates a new, empty post for the passed in blogId
+ this(blogId, "", "", "", "", 0, "", "", "","", 0, 0, isPage, "", true, false);
+ this.localDraft = true;
+ }
+
public Post(int blog_id, String title, String content, String excerpt, String picturePaths, long date, String categories, String tags, String status,
String password, double latitude, double longitude, boolean isPage, String postFormat,
boolean createBlogReference, boolean isLocalChange) {
@@ -363,7 +370,7 @@ public boolean isPage() {
return isPage;
}
- public void setPage(boolean isPage) {
+ public void setIsPage(boolean isPage) {
this.isPage = isPage;
}
@@ -450,4 +457,26 @@ public boolean equals(Object other) {
this.blogID == otherPost.blogID
);
}
+
+ /**
+ * Get the entire post content
+ * Joins description and mt_text_more fields if both are valid
+ * @return post content as String
+ */
+ public String getContent() {
+ String postContent;
+ if (!getMt_text_more().equals("")) {
+ if (isLocalDraft())
+ postContent = getDescription() + "\n<!--more-->\n" + getMt_text_more();
+ else
+ postContent = getDescription() + "\n\n" + getMt_text_more();
+ } else
+ postContent = getDescription();
+
+ return postContent;
+ }
+
+ public boolean isNew() {
+ return getId() >= 0;
+ }
}
\ No newline at end of file
diff --git a/src/org/wordpress/android/ui/media/MediaUtils.java b/src/org/wordpress/android/ui/media/MediaUtils.java
index 1fabe1a5a0a4..0cea24ed99d7 100644
--- a/src/org/wordpress/android/ui/media/MediaUtils.java
+++ b/src/org/wordpress/android/ui/media/MediaUtils.java
@@ -1,14 +1,20 @@
package org.wordpress.android.ui.media;
import java.io.File;
+import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
+import java.util.Random;
import java.util.TimeZone;
import android.app.Activity;
import android.app.AlertDialog;
+import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
@@ -18,6 +24,8 @@
import android.support.v4.app.Fragment;
import android.support.v4.content.CursorLoader;
+import org.wordpress.android.util.ImageHelper;
+import org.wordpress.android.util.WPImageSpan;
import org.wordpress.passcodelock.AppLockManager;
import org.wordpress.android.R;
@@ -110,12 +118,19 @@ public static String getDate(long ms) {
public static void launchPictureLibrary(Activity activity) {
+ /*Intent intent = new Intent(Intent.ACTION_PICK);
+ intent.setType("image/*");
+ intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);*/
+
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
- intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
-
+ intent.setAction(Intent.ACTION_GET_CONTENT);
+
AppLockManager.getInstance().setExtendedTimeout();
- activity.startActivityForResult(intent, RequestCode.ACTIVITY_REQUEST_CODE_PICTURE_LIBRARY);
+
+ activity.startActivityForResult(Intent.createChooser(intent, "Select Picture:"), RequestCode.ACTIVITY_REQUEST_CODE_PICTURE_LIBRARY);
+
+ //activity.startActivityForResult(intent, RequestCode.ACTIVITY_REQUEST_CODE_PICTURE_LIBRARY);
}
public static void launchPictureLibrary(Fragment fragment) {
@@ -280,4 +295,129 @@ public static boolean canDeleteMedia(String blogId, String mediaID) {
}
return true;
}
+
+ public static WPImageSpan prepareWPImageSpan(Context context, String blogId, final String mediaId) {
+ Cursor cursor = WordPress.wpDB.getMediaFile(blogId, mediaId);
+ if (cursor == null || !cursor.moveToFirst()){
+ if (cursor != null)
+ cursor.close();
+ return null;
+ }
+
+ String url = cursor.getString(cursor.getColumnIndex("fileURL"));
+ if (url == null) {
+ cursor.close();
+ return null;
+ }
+
+ Uri uri = Uri.parse(url);
+ WPImageSpan imageSpan = new WPImageSpan(context, R.drawable.remote_image, uri);
+ imageSpan.setMediaId(mediaId);
+ imageSpan.setCaption(cursor.getString(cursor.getColumnIndex("caption")));
+ imageSpan.setDescription(cursor.getString(cursor.getColumnIndex("description")));
+ imageSpan.setTitle(cursor.getString(cursor.getColumnIndex("title")));
+ imageSpan.setWidth(cursor.getInt(cursor.getColumnIndex("width")));
+ imageSpan.setHeight(cursor.getInt(cursor.getColumnIndex("height")));
+ imageSpan.setMimeType(cursor.getString(cursor.getColumnIndex("mimeType")));
+ imageSpan.setFileName(cursor.getString(cursor.getColumnIndex("fileName")));
+ imageSpan.setThumbnailURL(cursor.getString(cursor.getColumnIndex("thumbnailURL")));
+ imageSpan.setDateCreatedGMT(cursor.getLong(cursor.getColumnIndex("date_created_gmt")));
+
+ boolean isVideo = false;
+ String mimeType = cursor.getString(cursor.getColumnIndex("mimeType"));
+ if (mimeType != null && mimeType.contains("video"))
+ isVideo = true;
+ imageSpan.setVideo(isVideo);
+ cursor.close();
+
+ return imageSpan;
+ }
+
+ // Calculate the minimun width between the blog setting and picture real width
+ public static int getMinimumImageWitdh(Context context, Uri curStream) {
+ String imageWidth = WordPress.getCurrentBlog().getMaxImageWidth();
+ int imageWidthBlogSetting = Integer.MAX_VALUE;
+
+ if (!imageWidth.equals("Original Size")) {
+ try {
+ imageWidthBlogSetting = Integer.valueOf(imageWidth);
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ }
+ }
+
+ int[] dimensions = ImageHelper.getImageSize(curStream, context);
+ int imageWidthPictureSetting = dimensions[0] == 0 ? Integer.MAX_VALUE : dimensions[0];
+
+ if (Math.min(imageWidthPictureSetting, imageWidthBlogSetting) == Integer.MAX_VALUE) {
+ //Default value in case of errors reading the picture size and the blog settings is set to Original size
+ return 1024;
+ } else {
+ return Math.min(imageWidthPictureSetting, imageWidthBlogSetting);
+ }
+ }
+
+ public static void setWPImageSpanWidth(Context context, Uri curStream, WPImageSpan is) {
+ is.setWidth(getMinimumImageWitdh(context, curStream));
+ }
+
+ public static boolean isPicasaImage(Uri imageUri) {
+ // Check if the imageUri returned is of picasa or not
+ if (imageUri.toString().startsWith("content://com.android.gallery3d.provider")) {
+ // Use the com.google provider for devices prior to 3.0
+ imageUri = Uri.parse(imageUri.toString().replace("com.android.gallery3d", "com.google.android.gallery3d"));
+ }
+
+ if (imageUri.toString().startsWith("content://com.google.android.gallery3d"))
+ return true;
+ else
+ return false;
+ }
+
+ public static Uri downloadExternalImage(Context context, Uri imageUri) {
+ File cacheDir;
+
+ // If the device has an SD card
+ if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
+ cacheDir = new File(android.os.Environment.getExternalStorageDirectory() + "/WordPress/images");
+ else {
+ // If no SD card
+ cacheDir = context.getApplicationContext().getCacheDir();
+ }
+
+ if (!cacheDir.exists())
+ cacheDir.mkdirs();
+ Random r = new Random();
+ final String path = "wp-" + r.nextInt(400) + r.nextInt(400) + ".jpg";
+
+ File f = new File(cacheDir, path);
+
+ try {
+ InputStream input;
+ // Download the file
+ if (imageUri.toString().startsWith("content://com.google.android.gallery3d")) {
+ input = context.getContentResolver().openInputStream(imageUri);
+ } else {
+ input = new URL(imageUri.toString()).openStream();
+ }
+ OutputStream output = new FileOutputStream(f);
+
+ byte data[] = new byte[1024];
+ int count;
+ while ((count = input.read(data)) != -1) {
+ output.write(data, 0, count);
+ }
+
+ output.flush();
+ output.close();
+ input.close();
+
+ Uri newUri = Uri.fromFile(f);
+ return newUri;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ return null;
+ }
}
diff --git a/src/org/wordpress/android/ui/posts/EditPostActivity.java b/src/org/wordpress/android/ui/posts/EditPostActivity.java
index eddb994df135..556c96469dd3 100644
--- a/src/org/wordpress/android/ui/posts/EditPostActivity.java
+++ b/src/org/wordpress/android/ui/posts/EditPostActivity.java
@@ -593,7 +593,7 @@ public boolean onContextItemSelected(MenuItem item) {
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getSupportMenuInflater();
- inflater.inflate(R.menu.edit, menu);
+ inflater.inflate(R.menu.edit_post, menu);
return true;
}
@@ -939,7 +939,7 @@ public void onClick(DialogInterface dialog, int whichButton) {
if (selectionStart >= 0 && mContentEditText.getSelectionEnd() >= selectionStart);
mContentEditText.setSelection(selectionStart, mContentEditText.getSelectionEnd());
}
-
+
// get media gallery spans
MediaGalleryImageSpan[] gallerySpans = s.getSpans(charPosition, charPosition, MediaGalleryImageSpan.class);
@@ -947,7 +947,7 @@ public void onClick(DialogInterface dialog, int whichButton) {
final MediaGalleryImageSpan gallerySpan = gallerySpans[0];
startMediaGalleryActivity(gallerySpan.getMediaGallery());
}
-
+
}
} else if (event.getAction() == 1) {
mScrollDetected = false;
diff --git a/src/org/wordpress/android/ui/posts/EditPostContentFragment.java b/src/org/wordpress/android/ui/posts/EditPostContentFragment.java
new file mode 100644
index 000000000000..908074558f55
--- /dev/null
+++ b/src/org/wordpress/android/ui/posts/EditPostContentFragment.java
@@ -0,0 +1,1479 @@
+package org.wordpress.android.ui.posts;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.os.Environment;
+import android.text.Editable;
+import android.text.Layout;
+import android.text.Selection;
+import android.text.Spannable;
+import android.text.SpannableStringBuilder;
+import android.text.TextUtils;
+import android.text.TextWatcher;
+import android.text.method.ArrowKeyMovementMethod;
+import android.text.style.AlignmentSpan;
+import android.text.style.CharacterStyle;
+import android.text.style.QuoteSpan;
+import android.text.style.StrikethroughSpan;
+import android.text.style.StyleSpan;
+import android.text.style.URLSpan;
+import android.view.ContextMenu;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.MenuItem;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.view.animation.AlphaAnimation;
+import android.view.animation.Animation;
+import android.view.animation.DecelerateInterpolator;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
+import android.widget.EditText;
+import android.widget.ImageButton;
+import android.widget.RelativeLayout;
+import android.widget.SeekBar;
+import android.widget.Spinner;
+import android.widget.TextView;
+import android.widget.Toast;
+import android.widget.ToggleButton;
+
+import com.actionbarsherlock.app.ActionBar;
+import com.actionbarsherlock.app.SherlockFragment;
+import com.android.volley.VolleyError;
+import com.android.volley.toolbox.ImageLoader;
+
+import org.wordpress.android.R;
+import org.wordpress.android.WordPress;
+import org.wordpress.android.models.Blog;
+import org.wordpress.android.models.MediaFile;
+import org.wordpress.android.models.MediaGallery;
+import org.wordpress.android.models.Post;
+import org.wordpress.android.ui.media.MediaGalleryActivity;
+import org.wordpress.android.ui.media.MediaGalleryPickerActivity;
+import org.wordpress.android.ui.media.MediaUtils;
+import org.wordpress.android.util.DeviceUtils;
+import org.wordpress.android.util.ImageHelper;
+import org.wordpress.android.util.MediaGalleryImageSpan;
+import org.wordpress.android.util.StringUtils;
+import org.wordpress.android.util.WPEditText;
+import org.wordpress.android.util.WPHtml;
+import org.wordpress.android.util.WPImageSpan;
+import org.wordpress.android.util.WPUnderlineSpan;
+import org.wordpress.passcodelock.AppLockManager;
+import org.xmlrpc.android.ApiHelper;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by dan on 11/20/13.
+ */
+public class EditPostContentFragment extends SherlockFragment implements TextWatcher,
+ WPEditText.OnSelectionChangedListener, View.OnTouchListener {
+
+ NewEditPostActivity mActivity;
+
+ private static final int ACTIVITY_REQUEST_CODE_CREATE_LINK = 4;
+ public static final String NEW_MEDIA_POST_EXTRA = "NEW_MEDIA_POST_ID";
+
+ private Post mPost;
+
+ private WPEditText mContentEditText;
+ private ImageButton mAddPictureButton;
+ private EditText mTitleEditText;
+ private ToggleButton mBoldToggleButton, mEmToggleButton, mBquoteToggleButton;
+ private ToggleButton mUnderlineToggleButton, mStrikeToggleButton;
+ private Button mLinkButton, mMoreButton;
+ private RelativeLayout mFormatBar;
+ private boolean mIsBackspace;
+ private boolean mScrollDetected;
+
+ private String mMediaCapturePath = "";
+
+ private int mStyleStart, mSelectionStart, mSelectionEnd;
+ private int mLastPosition = -1;
+ private int mCurrentActivityRequest = -1;
+
+ private float mLastYPos = 0;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ mActivity = (NewEditPostActivity)getActivity();
+
+ ViewGroup rootView = (ViewGroup) inflater
+ .inflate(R.layout.fragment_edit_post_content, container, false);
+
+ mFormatBar = (RelativeLayout) rootView.findViewById(R.id.format_bar);
+ mTitleEditText = (EditText)rootView.findViewById(R.id.post_title);
+ mContentEditText = (WPEditText)rootView.findViewById(R.id.post_content);
+ mBoldToggleButton = (ToggleButton) rootView.findViewById(R.id.bold);
+ mEmToggleButton = (ToggleButton) rootView.findViewById(R.id.em);
+ mBquoteToggleButton = (ToggleButton) rootView.findViewById(R.id.bquote);
+ mUnderlineToggleButton = (ToggleButton) rootView.findViewById(R.id.underline);
+ mStrikeToggleButton = (ToggleButton) rootView.findViewById(R.id.strike);
+ mAddPictureButton = (ImageButton) rootView.findViewById(R.id.addPictureButton);
+ mLinkButton = (Button) rootView.findViewById(R.id.link);
+ mMoreButton = (Button) rootView.findViewById(R.id.more);
+
+ registerForContextMenu(mAddPictureButton);
+ mContentEditText.setOnSelectionChangedListener(this);
+ mContentEditText.setOnTouchListener(this);
+ mContentEditText.addTextChangedListener(this);
+ mAddPictureButton.setOnClickListener(mFormatBarButtonClickListener);
+ mBoldToggleButton.setOnClickListener(mFormatBarButtonClickListener);
+ mLinkButton.setOnClickListener(mFormatBarButtonClickListener);
+ mEmToggleButton.setOnClickListener(mFormatBarButtonClickListener);
+ mUnderlineToggleButton.setOnClickListener(mFormatBarButtonClickListener);
+ mStrikeToggleButton.setOnClickListener(mFormatBarButtonClickListener);
+ mBquoteToggleButton.setOnClickListener(mFormatBarButtonClickListener);
+ mMoreButton.setOnClickListener(mFormatBarButtonClickListener);
+
+ mPost = mActivity.getPost();
+ if (mPost != null) {
+ if (!TextUtils.isEmpty(mPost.getContent())) {
+ if (mPost.isLocalDraft())
+ mContentEditText.setText(WPHtml.fromHtml(mPost.getContent().replaceAll("\uFFFC", ""), mActivity, mPost));
+ else
+ mContentEditText.setText(mPost.getContent().replaceAll("\uFFFC", ""));
+ }
+ if (!TextUtils.isEmpty(mPost.getTitle())) {
+ mTitleEditText.setText(mPost.getTitle());
+ }
+ }
+
+ mContentEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
+ @Override
+ public void onFocusChange(View v, boolean hasFocus) {
+ if (mPost != null && hasFocus) {
+ setContentEditingModeVisible(true);
+ }
+ }
+ });
+
+ setContentEditTextFocusable(true);
+
+ return rootView;
+ }
+
+ public void setContentEditTextFocusable(boolean canFocus) {
+ if (mContentEditText != null) {
+ mContentEditText.setFocusableInTouchMode(canFocus);
+ mContentEditText.setFocusable(canFocus);
+ }
+ }
+
+ private void setContentEditingModeVisible(boolean isVisible) {
+ if (mActivity == null)
+ return;
+ ActionBar actionBar = mActivity.getSupportActionBar();
+ if (isVisible) {
+
+ //actionBar.hide();
+
+ actionBar.setDisplayShowHomeEnabled(false);
+ actionBar.setDisplayShowTitleEnabled(false);
+ actionBar.setDisplayShowCustomEnabled(true);
+ ViewGroup actionBarLayout = (ViewGroup) mActivity.getLayoutInflater().inflate(R.layout.edit_post_content_action_bar, null);
+ actionBar.setCustomView(actionBarLayout);
+ Button doneButton = (Button) mActivity.findViewById(R.id.action_bar_done);
+ doneButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ setContentEditingModeVisible(false);
+ }
+ });
+
+ actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
+ mTitleEditText.setVisibility(View.GONE);
+
+ mActivity.supportInvalidateOptionsMenu();
+ //actionBar.show();
+
+ Animation fadeIn = new AlphaAnimation(0, 1);
+ fadeIn.setInterpolator(new DecelerateInterpolator()); //add this
+ fadeIn.setDuration(300);
+ fadeIn.setStartOffset(300);
+ mFormatBar.setVisibility(View.VISIBLE);
+ mFormatBar.startAnimation(fadeIn);
+
+ } else {
+ //actionBar.hide();
+
+ actionBar.setDisplayShowHomeEnabled(true);
+ actionBar.setDisplayShowTitleEnabled(true);
+ actionBar.setDisplayShowCustomEnabled(false);
+ actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
+ mTitleEditText.setVisibility(View.VISIBLE);
+ mFormatBar.setVisibility(View.GONE);
+ mActivity.supportInvalidateOptionsMenu();
+
+ //actionBar.show();
+ }
+ }
+
+ public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
+ menu.add(0, 0, 0, getResources().getText(R.string.select_photo));
+ if (DeviceUtils.getInstance().hasCamera(getActivity())) {
+ menu.add(0, 1, 0, getResources().getText(R.string.media_add_popup_capture_photo));
+ }
+ menu.add(0, 2, 0, getResources().getText(R.string.select_video));
+ if (DeviceUtils.getInstance().hasCamera(getActivity())) {
+ menu.add(0, 3, 0, getResources().getText(R.string.media_add_popup_capture_video));
+ }
+
+ menu.add(0, 4, 0, getResources().getText(R.string.media_add_new_media_gallery));
+ menu.add(0, 5, 0, getResources().getText(R.string.select_from_media_library));
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+
+ if (data != null || ((requestCode == MediaUtils.RequestCode.ACTIVITY_REQUEST_CODE_TAKE_PHOTO || requestCode == MediaUtils.RequestCode.ACTIVITY_REQUEST_CODE_TAKE_VIDEO))) {
+ Bundle extras;
+
+ switch (requestCode) {
+ case MediaGalleryActivity.REQUEST_CODE:
+ if (resultCode == Activity.RESULT_OK) {
+ handleMediaGalleryResult(data);
+ }
+ break;
+ case MediaGalleryPickerActivity.REQUEST_CODE:
+ if (resultCode == Activity.RESULT_OK) {
+ handleMediaGalleryPickerResult(data);
+ }
+ break;
+ case MediaUtils.RequestCode.ACTIVITY_REQUEST_CODE_PICTURE_LIBRARY:
+ Uri imageUri = data.getData();
+ verifyImage(imageUri);
+ break;
+ case MediaUtils.RequestCode.ACTIVITY_REQUEST_CODE_TAKE_PHOTO:
+ if (resultCode == Activity.RESULT_OK) {
+ try {
+ File f = new File(mMediaCapturePath);
+ Uri capturedImageUri = Uri.fromFile(f);
+ f = null;
+ if (!addMedia(capturedImageUri, null))
+ Toast.makeText(getActivity(), getResources().getText(R.string.gallery_error), Toast.LENGTH_SHORT).show();
+ getActivity().sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"
+ + Environment.getExternalStorageDirectory())));
+ } catch (Exception e) {
+ e.printStackTrace();
+ } catch (OutOfMemoryError e) {
+ e.printStackTrace();
+ }
+ }
+ break;
+ case MediaUtils.RequestCode.ACTIVITY_REQUEST_CODE_VIDEO_LIBRARY:
+ Uri videoUri = data.getData();
+ if (!addMedia(videoUri, null))
+ Toast.makeText(getActivity(), getResources().getText(R.string.gallery_error), Toast.LENGTH_SHORT).show();
+ break;
+ case MediaUtils.RequestCode.ACTIVITY_REQUEST_CODE_TAKE_VIDEO:
+ if (resultCode == Activity.RESULT_OK) {
+ Uri capturedVideoUri = MediaUtils.getLastRecordedVideoUri(getActivity());
+ if (!addMedia(capturedVideoUri, null))
+ Toast.makeText(getActivity(), getResources().getText(R.string.gallery_error), Toast.LENGTH_SHORT).show();
+ }
+ break;
+ case ACTIVITY_REQUEST_CODE_CREATE_LINK:
+ try {
+ extras = data.getExtras();
+ String linkURL = extras.getString("linkURL");
+ if (!linkURL.equals("http://") && !linkURL.equals("")) {
+
+ if (mSelectionStart > mSelectionEnd) {
+ int temp = mSelectionEnd;
+ mSelectionEnd = mSelectionStart;
+ mSelectionStart = temp;
+ }
+ Editable str = mContentEditText.getText();
+ if (mPost.isLocalDraft()) {
+ if (extras.getString("linkText") == null) {
+ if (mSelectionStart < mSelectionEnd)
+ str.delete(mSelectionStart, mSelectionEnd);
+ str.insert(mSelectionStart, linkURL);
+ str.setSpan(new URLSpan(linkURL), mSelectionStart, mSelectionStart + linkURL.length(),
+ Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+ mContentEditText.setSelection(mSelectionStart + linkURL.length());
+ } else {
+ String linkText = extras.getString("linkText");
+ if (mSelectionStart < mSelectionEnd)
+ str.delete(mSelectionStart, mSelectionEnd);
+ str.insert(mSelectionStart, linkText);
+ str.setSpan(new URLSpan(linkURL), mSelectionStart, mSelectionStart + linkText.length(),
+ Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+ mContentEditText.setSelection(mSelectionStart + linkText.length());
+ }
+ } else {
+ if (extras.getString("linkText") == null) {
+ if (mSelectionStart < mSelectionEnd)
+ str.delete(mSelectionStart, mSelectionEnd);
+ String urlHTML = "" + linkURL + "";
+ str.insert(mSelectionStart, urlHTML);
+ mContentEditText.setSelection(mSelectionStart + urlHTML.length());
+ } else {
+ String linkText = extras.getString("linkText");
+ if (mSelectionStart < mSelectionEnd)
+ str.delete(mSelectionStart, mSelectionEnd);
+ String urlHTML = "" + linkText + "";
+ str.insert(mSelectionStart, urlHTML);
+ mContentEditText.setSelection(mSelectionStart + urlHTML.length());
+ }
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ break;
+ }
+ }
+ }
+
+ @Override
+ public boolean onContextItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case 0:
+ launchPictureLibrary();
+ return true;
+ case 1:
+ launchCamera();
+ return true;
+ case 2:
+ launchVideoLibrary();
+ return true;
+ case 3:
+ launchVideoCamera();
+ return true;
+ case 4:
+ startMediaGalleryActivity(null);
+ return true;
+ case 5:
+ startMediaGalleryAddActivity();
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Media
+ */
+
+ private void launchPictureLibrary() {
+ mCurrentActivityRequest = MediaUtils.RequestCode.ACTIVITY_REQUEST_CODE_PICTURE_LIBRARY;
+ MediaUtils.launchPictureLibrary(this);
+ AppLockManager.getInstance().setExtendedTimeout();
+ }
+
+ private void launchCamera() {
+ MediaUtils.launchCamera(this, new MediaUtils.LaunchCameraCallback() {
+
+ @Override
+ public void onMediaCapturePathReady(String mediaCapturePath) {
+ mMediaCapturePath = mediaCapturePath;
+ mCurrentActivityRequest = MediaUtils.RequestCode.ACTIVITY_REQUEST_CODE_TAKE_PHOTO;
+ AppLockManager.getInstance().setExtendedTimeout();
+ }
+ });
+ }
+
+ private void launchVideoLibrary() {
+ mCurrentActivityRequest = MediaUtils.RequestCode.ACTIVITY_REQUEST_CODE_VIDEO_LIBRARY;
+ MediaUtils.launchVideoLibrary(this);
+ AppLockManager.getInstance().setExtendedTimeout();
+ }
+
+ private void launchVideoCamera() {
+ mCurrentActivityRequest = MediaUtils.RequestCode.ACTIVITY_REQUEST_CODE_TAKE_VIDEO;
+ MediaUtils.launchVideoCamera(this);
+ AppLockManager.getInstance().setExtendedTimeout();
+ }
+
+ private void verifyImage(Uri imageUri) {
+ if (MediaUtils.isPicasaImage(imageUri)) {
+ // Create an AsyncTask to download the file
+ new DownloadImageTask().execute(imageUri);
+ } else {
+ // It is a regular local image file
+ if (!addMedia(imageUri, null))
+ Toast.makeText(getActivity(), getResources().getText(R.string.gallery_error), Toast.LENGTH_SHORT).show();
+ }
+ }
+
+ public void savePostContent(boolean isAutoSave) {
+
+ if (mPost == null)
+ return;
+
+ String title = mTitleEditText.getText().toString();
+ String content;
+
+ if (mPost.isLocalDraft() || !isAutoSave) {
+ Editable e = mContentEditText.getText();
+ if (android.os.Build.VERSION.SDK_INT >= 14) {
+ // remove suggestion spans, they cause craziness in
+ // WPHtml.toHTML().
+ CharacterStyle[] style = e.getSpans(0, e.length(), CharacterStyle.class);
+ for (int i = 0; i < style.length; i++) {
+ if (style[i].getClass().getName().equals("android.text.style.SuggestionSpan"))
+ e.removeSpan(style[i]);
+ }
+ }
+ content = WPHtml.toHtml(e);
+ // replace duplicate tags so there's not duplicates, trac #86
+ content = content.replace("
", "
");
+ content = content.replace("
", "");
+ content = content.replace("
", "
");
+ // sometimes the editor creates extra tags
+ content = content.replace("", "").replace("", "").replace("", "")
+ .replace("", "").replace("", "");
+ } else {
+ content = mContentEditText.getText().toString();
+ }
+
+ String images = "";
+ // update the images
+ mPost.deleteMediaFiles();
+
+ Editable s = mContentEditText.getText();
+
+ // Add gallery shortcode
+ MediaGalleryImageSpan[] gallerySpans = s.getSpans(0, s.length(), MediaGalleryImageSpan.class);
+ for (MediaGalleryImageSpan gallerySpan : gallerySpans) {
+ int start = s.getSpanStart(gallerySpan);
+ s.removeSpan(gallerySpan);
+ s.insert(start, WPHtml.getGalleryShortcode(gallerySpan));
+ }
+
+ WPImageSpan[] imageSpans = s.getSpans(0, s.length(), WPImageSpan.class);
+ if (imageSpans.length != 0) {
+
+ for (int i = 0; i < imageSpans.length; i++) {
+ WPImageSpan wpIS = imageSpans[i];
+ images += wpIS.getImageSource().toString() + ",";
+
+ if (wpIS.getMediaId() != null) {
+ updateMediaFileOnServer(wpIS);
+ } else {
+ MediaFile mf = new MediaFile();
+ mf.setBlogId(WordPress.getCurrentBlog().getBlogId() + "");
+ mf.setPostID(mPost.getId());
+ mf.setTitle(wpIS.getTitle());
+ mf.setCaption(wpIS.getCaption());
+ // mf.setDescription(wpIS.getDescription());
+ mf.setFeatured(wpIS.isFeatured());
+ mf.setFeaturedInPost(wpIS.isFeaturedInPost());
+ mf.setFileName(wpIS.getImageSource().toString());
+ mf.setFilePath(wpIS.getImageSource().toString());
+ mf.setHorizontalAlignment(wpIS.getHorizontalAlignment());
+ mf.setWidth(wpIS.getWidth());
+ mf.setVideo(wpIS.isVideo());
+ mf.save();
+ }
+
+ int tagStart = s.getSpanStart(wpIS);
+ if (!isAutoSave) {
+ s.removeSpan(wpIS);
+
+ // network image has a mediaId
+ if (wpIS.getMediaId() != null && wpIS.getMediaId().length() > 0) {
+ s.insert(tagStart, WPHtml.getContent(wpIS));
+
+ } else { // local image for upload
+ s.insert(tagStart, "
");
+ }
+ }
+ }
+ }
+
+ String moreTag = "";
+
+ mPost.setTitle(title);
+ // split up the post content if there's a more tag
+ if (mPost.isLocalDraft() && content.indexOf(moreTag) >= 0) {
+ mPost.setDescription(content.substring(0, content.indexOf(moreTag)));
+ mPost.setMt_text_more(content.substring(content.indexOf(moreTag) + moreTag.length(), content.length()));
+ } else {
+ mPost.setDescription(content);
+ mPost.setMt_text_more("");
+ }
+ mPost.setMediaPaths(images);
+ if (!mPost.isLocalDraft())
+ mPost.setLocalChange(true);
+ mPost.update();
+ }
+
+ public boolean hasEmptyContentFields() {
+ return TextUtils.isEmpty(mTitleEditText.getText()) && TextUtils.isEmpty(mContentEditText.getText());
+ }
+
+ private class DownloadImageTask extends AsyncTask {
+
+ @Override
+ protected Uri doInBackground(Uri... uris) {
+ Uri imageUri = uris[0];
+ return MediaUtils.downloadExternalImage(getActivity(), imageUri);
+ }
+
+ @Override
+ protected void onPreExecute() {
+ //TODO: Show a toast instead?
+ //showDialog(ID_DIALOG_DOWNLOAD);
+ }
+
+ protected void onPostExecute(Uri newUri) {
+ //dismissDialog(ID_DIALOG_DOWNLOAD);
+ if (newUri != null)
+ addMedia(newUri, null);
+ else
+ Toast.makeText(getActivity(), getString(R.string.error_downloading_image), Toast.LENGTH_SHORT).show();
+ }
+ }
+
+ private void prepareMediaGallery() {
+ MediaGallery mediaGallery = new MediaGallery();
+ mediaGallery.setIds(getActivity().getIntent().getStringArrayListExtra("NEW_MEDIA_GALLERY_EXTRA_IDS"));
+
+ startMediaGalleryActivity(mediaGallery);
+ }
+
+ private void prepareMediaPost() {
+ String mediaId = getActivity().getIntent().getStringExtra(NEW_MEDIA_POST_EXTRA);
+ addExistingMediaToEditor(mediaId);
+ }
+
+ private void addExistingMediaToEditor(String mediaId) {
+ if (WordPress.getCurrentBlog() == null)
+ return;
+
+ String blogId = String.valueOf(WordPress.getCurrentBlog().getBlogId());
+
+ WPImageSpan imageSpan = MediaUtils.prepareWPImageSpan(getActivity(), blogId, mediaId);
+ if (imageSpan == null)
+ return;
+
+ // based on addMedia()
+
+ int selectionStart = mContentEditText.getSelectionStart();
+ int selectionEnd = mContentEditText.getSelectionEnd();
+
+ if (selectionStart > selectionEnd) {
+ int temp = selectionEnd;
+ selectionEnd = selectionStart;
+ selectionStart = temp;
+ }
+
+ int line = 0, column = 0;
+ try {
+ line = mContentEditText.getLayout().getLineForOffset(selectionStart);
+ column = mContentEditText.getSelectionStart() - mContentEditText.getLayout().getLineStart(line);
+ } catch (Exception ex) {
+ }
+
+ Editable s = mContentEditText.getText();
+ WPImageSpan[] gallerySpans = s.getSpans(selectionStart, selectionEnd, WPImageSpan.class);
+ if (gallerySpans.length != 0) {
+ // insert a few line breaks if the cursor is already on an image
+ s.insert(selectionEnd, "\n\n");
+ selectionStart = selectionStart + 2;
+ selectionEnd = selectionEnd + 2;
+ } else if (column != 0) {
+ // insert one line break if the cursor is not at the first column
+ s.insert(selectionEnd, "\n");
+ selectionStart = selectionStart + 1;
+ selectionEnd = selectionEnd + 1;
+ }
+
+ s.insert(selectionStart, " ");
+ s.setSpan(imageSpan, selectionStart, selectionEnd + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+ AlignmentSpan.Standard as = new AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER);
+ s.setSpan(as, selectionStart, selectionEnd + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+ s.insert(selectionEnd + 1, "\n\n");
+ try {
+ mContentEditText.setSelection(s.length());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ // load image from server
+ loadWPImageSpanThumbnail(imageSpan);
+ }
+
+ private void updateMediaFileOnServer(WPImageSpan wpIS) {
+
+ Blog currentBlog = WordPress.getCurrentBlog();
+ if (currentBlog == null || wpIS == null)
+ return;
+
+ MediaFile mf = getMediaFileFromWPImageSpan(wpIS);
+
+ final String mediaId = mf.getMediaId();
+ final String title = mf.getTitle();
+ final String description = mf.getDescription();
+ final String caption = mf.getCaption();
+
+ ApiHelper.EditMediaItemTask task = new ApiHelper.EditMediaItemTask(mf.getMediaId(), mf.getTitle(),
+ mf.getDescription(), mf.getCaption(),
+ new ApiHelper.EditMediaItemTask.Callback() {
+
+ @Override
+ public void onSuccess() {
+ String blogId = String.valueOf(WordPress.getCurrentBlog().getBlogId());
+ WordPress.wpDB.updateMediaFile(blogId, mediaId, title, description, caption);
+ }
+
+ @Override
+ public void onFailure() {
+ Toast.makeText(getActivity(), R.string.media_edit_failure, Toast.LENGTH_LONG).show();
+ }
+ });
+
+ List
", "").replace("", "").replace("", "")
.replace("", "").replace("", "");
} else {
- content = mContentEditText.getText().toString();
+ content = (mContentEditText.getText() != null) ? mContentEditText.getText().toString() : "";
}
String images = "";
@@ -464,8 +566,7 @@ public void savePostContent(boolean isAutoSave) {
WPImageSpan[] imageSpans = s.getSpans(0, s.length(), WPImageSpan.class);
if (imageSpans.length != 0) {
- for (int i = 0; i < imageSpans.length; i++) {
- WPImageSpan wpIS = imageSpans[i];
+ for (WPImageSpan wpIS : imageSpans) {
images += wpIS.getImageSource().toString() + ",";
if (wpIS.getMediaId() != null) {
@@ -506,7 +607,7 @@ public void savePostContent(boolean isAutoSave) {
mPost.setTitle(title);
// split up the post content if there's a more tag
- if (mPost.isLocalDraft() && content.indexOf(moreTag) >= 0) {
+ if (mPost.isLocalDraft() && content.contains(moreTag)) {
mPost.setDescription(content.substring(0, content.indexOf(moreTag)));
mPost.setMt_text_more(content.substring(content.indexOf(moreTag) + moreTag.length(), content.length()));
} else {
@@ -579,36 +680,37 @@ private void addExistingMediaToEditor(String mediaId) {
selectionStart = temp;
}
- int line = 0, column = 0;
- try {
+ int line, column = 0;
+ if (mContentEditText.getLayout() != null) {
line = mContentEditText.getLayout().getLineForOffset(selectionStart);
column = mContentEditText.getSelectionStart() - mContentEditText.getLayout().getLineStart(line);
- } catch (Exception ex) {
}
Editable s = mContentEditText.getText();
- WPImageSpan[] gallerySpans = s.getSpans(selectionStart, selectionEnd, WPImageSpan.class);
- if (gallerySpans.length != 0) {
- // insert a few line breaks if the cursor is already on an image
- s.insert(selectionEnd, "\n\n");
- selectionStart = selectionStart + 2;
- selectionEnd = selectionEnd + 2;
- } else if (column != 0) {
- // insert one line break if the cursor is not at the first column
- s.insert(selectionEnd, "\n");
- selectionStart = selectionStart + 1;
- selectionEnd = selectionEnd + 1;
- }
+ if (s != null) {
+ WPImageSpan[] gallerySpans = s.getSpans(selectionStart, selectionEnd, WPImageSpan.class);
+ if (gallerySpans.length != 0) {
+ // insert a few line breaks if the cursor is already on an image
+ s.insert(selectionEnd, "\n\n");
+ selectionStart = selectionStart + 2;
+ selectionEnd = selectionEnd + 2;
+ } else if (column != 0) {
+ // insert one line break if the cursor is not at the first column
+ s.insert(selectionEnd, "\n");
+ selectionStart = selectionStart + 1;
+ selectionEnd = selectionEnd + 1;
+ }
- s.insert(selectionStart, " ");
- s.setSpan(imageSpan, selectionStart, selectionEnd + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- AlignmentSpan.Standard as = new AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER);
- s.setSpan(as, selectionStart, selectionEnd + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- s.insert(selectionEnd + 1, "\n\n");
- try {
- mContentEditText.setSelection(s.length());
- } catch (Exception e) {
- e.printStackTrace();
+ s.insert(selectionStart, " ");
+ s.setSpan(imageSpan, selectionStart, selectionEnd + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+ AlignmentSpan.Standard as = new AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER);
+ s.setSpan(as, selectionStart, selectionEnd + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+ s.insert(selectionEnd + 1, "\n\n");
+ try {
+ mContentEditText.setSelection(s.length());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
}
// load image from server
@@ -703,10 +805,12 @@ public void onResponse(ImageLoader.ImageContainer container, boolean arg1) {
if (resizedBitmap == null)
return;
Editable s = mContentEditText.getText();
+ if (s == null)
+ return;
WPImageSpan[] spans = s.getSpans(0, s.length(), WPImageSpan.class);
if (spans.length != 0) {
for (WPImageSpan is : spans) {
- if (mediaId != null && mediaId.equals(is.getMediaId()) && !is.isNetworkImageLoaded()) {
+ if (mediaId.equals(is.getMediaId()) && !is.isNetworkImageLoaded()) {
// replace the existing span with a new one with the correct image, re-add it to the same position.
int spanStart = s.getSpanStart(is);
@@ -776,24 +880,24 @@ private void handleMediaGalleryResult(Intent data) {
selectionStart = temp;
}
- int line = 0, column = 0;
- try {
+ int line, column = 0;
+ if (mContentEditText.getLayout() != null) {
line = mContentEditText.getLayout().getLineForOffset(selectionStart);
column = mContentEditText.getSelectionStart() - mContentEditText.getLayout().getLineStart(line);
- } catch (Exception ex) {
}
Editable s = mContentEditText.getText();
+ if (s == null)
+ return;
MediaGalleryImageSpan[] gallerySpans = s.getSpans(selectionStart, selectionEnd, MediaGalleryImageSpan.class);
if (gallerySpans.length != 0) {
- for (int i = 0; i < gallerySpans.length; i++) {
- if (gallerySpans[i].getMediaGallery().getUniqueId() == gallery.getUniqueId()) {
-
+ for (MediaGalleryImageSpan gallerySpan : gallerySpans) {
+ if (gallerySpan.getMediaGallery().getUniqueId() == gallery.getUniqueId()) {
// replace the existing span with a new gallery, re-add it to the same position.
- gallerySpans[i].setMediaGallery(gallery);
- int spanStart = s.getSpanStart(gallerySpans[i]);
- int spanEnd = s.getSpanEnd(gallerySpans[i]);
- s.setSpan(gallerySpans[i], spanStart, spanEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+ gallerySpan.setMediaGallery(gallery);
+ int spanStart = s.getSpanStart(gallerySpan);
+ int spanEnd = s.getSpanEnd(gallerySpan);
+ s.setSpan(gallerySpan, spanStart, spanEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
return;
@@ -848,7 +952,8 @@ private boolean addMedia(Uri imageUri, SpannableStringBuilder ssb) {
is.setTitle((String) mediaData.get("title"));
is.setImageSource(imageUri);
- is.setVideo(imageUri.getEncodedPath().contains("video"));
+ if (imageUri.getEncodedPath() != null)
+ is.setVideo(imageUri.getEncodedPath().contains("video"));
ssb.append(" ");
ssb.setSpan(is, ssb.length() - 1, ssb.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
AlignmentSpan.Standard as = new AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER);
@@ -866,21 +971,21 @@ private boolean addMedia(Uri imageUri, SpannableStringBuilder ssb) {
}
Editable s = mContentEditText.getText();
+ if (s == null)
+ return false;
WPImageSpan is = new WPImageSpan(getActivity(), resizedBitmap, imageUri);
MediaUtils.setWPImageSpanWidth(getActivity(), imageUri, is);
is.setTitle((String) mediaData.get("title"));
is.setImageSource(imageUri);
- if (imageUri.getEncodedPath().contains("video")) {
- is.setVideo(true);
- }
+ if (imageUri.getEncodedPath() != null)
+ is.setVideo(imageUri.getEncodedPath().contains("video"));
- int line = 0, column = 0;
- try {
+ int line, column = 0;
+ if (mContentEditText.getLayout() != null) {
line = mContentEditText.getLayout().getLineForOffset(selectionStart);
column = mContentEditText.getSelectionStart() - mContentEditText.getLayout().getLineStart(line);
- } catch (Exception ex) {
}
WPImageSpan[] image_spans = s.getSpans(selectionStart, selectionEnd, WPImageSpan.class);
@@ -931,7 +1036,8 @@ public void onClick(View v) {
} else if (id == R.id.more) {
mSelectionEnd = mContentEditText.getSelectionEnd();
Editable str = mContentEditText.getText();
- str.insert(mSelectionEnd, "\n\n");
+ if (str != null)
+ str.insert(mSelectionEnd, "\n\n");
} else if (id == R.id.link) {
mSelectionStart = mContentEditText.getSelectionStart();
mStyleStart = mSelectionStart;
@@ -943,37 +1049,22 @@ public void onClick(View v) {
}
Intent i = new Intent(getActivity(), EditLinkActivity.class);
if (mSelectionEnd > mSelectionStart) {
- String selectedText = mContentEditText.getText().subSequence(mSelectionStart, mSelectionEnd).toString();
- i.putExtra("selectedText", selectedText);
+ if (mContentEditText.getText() != null) {
+ String selectedText = mContentEditText.getText().subSequence(mSelectionStart, mSelectionEnd).toString();
+ i.putExtra("selectedText", selectedText);
+ }
}
startActivityForResult(i, ACTIVITY_REQUEST_CODE_CREATE_LINK);
} else if (id == R.id.addPictureButton) {
mAddPictureButton.performLongClick();
- } else if (id == R.id.post) {
- // TODO: uploading happens from new activity
- /*if (mAutoSaveHandler != null)
- mAutoSaveHandler.removeCallbacks(autoSaveRunnable);
- if (savePost(false, false)) {
- if (mPost.isUploaded() || !mPost.getPost_status().equals("localdraft")) {
- if (mQuickMediaType >= 0) {
- if (mQuickMediaType == Constants.QUICK_POST_PHOTO_CAMERA || mQuickMediaType == Constants.QUICK_POST_PHOTO_LIBRARY)
- mPost.setQuickPostType("QuickPhoto");
- else if (mQuickMediaType == Constants.QUICK_POST_VIDEO_CAMERA || mQuickMediaType == Constants.QUICK_POST_VIDEO_LIBRARY)
- mPost.setQuickPostType("QuickVideo");
- }
-
- WordPress.currentPost = mPost;
- PostUploadService.addPostToUpload(mPost);
- startService(new Intent(this, PostUploadService.class));
- }
- getActivity().finish();*/
- }
}
+ }
};
private void formatBtnClick(ToggleButton toggleButton, String tag) {
- try {
Spannable s = mContentEditText.getText();
+ if (s == null)
+ return;
int selectionStart = mContentEditText.getSelectionStart();
mStyleStart = selectionStart;
int selectionEnd = mContentEditText.getSelectionEnd();
@@ -991,10 +1082,10 @@ private void formatBtnClick(ToggleButton toggleButton, String tag) {
StyleSpan[] ss = str.getSpans(selectionStart, selectionEnd, StyleSpan.class);
boolean exists = false;
- for (int i = 0; i < ss.length; i++) {
- int style = ((StyleSpan) ss[i]).getStyle();
- if (style == android.graphics.Typeface.BOLD) {
- str.removeSpan(ss[i]);
+ for (StyleSpan styleSpan : ss) {
+ int style = styleSpan.getStyle();
+ if (style == Typeface.BOLD) {
+ str.removeSpan(styleSpan);
exists = true;
}
}
@@ -1008,10 +1099,10 @@ private void formatBtnClick(ToggleButton toggleButton, String tag) {
StyleSpan[] ss = str.getSpans(selectionStart, selectionEnd, StyleSpan.class);
boolean exists = false;
- for (int i = 0; i < ss.length; i++) {
- int style = ((StyleSpan) ss[i]).getStyle();
- if (style == android.graphics.Typeface.ITALIC) {
- str.removeSpan(ss[i]);
+ for (StyleSpan styleSpan : ss) {
+ int style = styleSpan.getStyle();
+ if (style == Typeface.ITALIC) {
+ str.removeSpan(styleSpan);
exists = true;
}
}
@@ -1026,8 +1117,8 @@ private void formatBtnClick(ToggleButton toggleButton, String tag) {
WPUnderlineSpan[] ss = str.getSpans(selectionStart, selectionEnd, WPUnderlineSpan.class);
boolean exists = false;
- for (int i = 0; i < ss.length; i++) {
- str.removeSpan(ss[i]);
+ for (WPUnderlineSpan underlineSpan : ss) {
+ str.removeSpan(underlineSpan);
exists = true;
}
@@ -1041,8 +1132,8 @@ private void formatBtnClick(ToggleButton toggleButton, String tag) {
StrikethroughSpan[] ss = str.getSpans(selectionStart, selectionEnd, StrikethroughSpan.class);
boolean exists = false;
- for (int i = 0; i < ss.length; i++) {
- str.removeSpan(ss[i]);
+ for (StrikethroughSpan strikethroughSpan : ss) {
+ str.removeSpan(strikethroughSpan);
exists = true;
}
@@ -1056,8 +1147,8 @@ private void formatBtnClick(ToggleButton toggleButton, String tag) {
QuoteSpan[] ss = str.getSpans(selectionStart, selectionEnd, QuoteSpan.class);
boolean exists = false;
- for (int i = 0; i < ss.length; i++) {
- str.removeSpan(ss[i]);
+ for (QuoteSpan quoteSpan : ss) {
+ str.removeSpan(quoteSpan);
exists = true;
}
@@ -1073,46 +1164,46 @@ private void formatBtnClick(ToggleButton toggleButton, String tag) {
StyleSpan[] ss = s.getSpans(mStyleStart - 1, mStyleStart, StyleSpan.class);
- for (int i = 0; i < ss.length; i++) {
- int tagStart = s.getSpanStart(ss[i]);
- int tagEnd = s.getSpanEnd(ss[i]);
- if (ss[i].getStyle() == android.graphics.Typeface.BOLD && tag.equals("strong")) {
- tagStart = s.getSpanStart(ss[i]);
- tagEnd = s.getSpanEnd(ss[i]);
- s.removeSpan(ss[i]);
- s.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), tagStart, tagEnd,
+ for (StyleSpan styleSpan : ss) {
+ int tagStart;
+ int tagEnd;
+ if (styleSpan.getStyle() == Typeface.BOLD && tag.equals("strong")) {
+ tagStart = s.getSpanStart(styleSpan);
+ tagEnd = s.getSpanEnd(styleSpan);
+ s.removeSpan(styleSpan);
+ s.setSpan(new StyleSpan(Typeface.BOLD), tagStart, tagEnd,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
- if (ss[i].getStyle() == android.graphics.Typeface.ITALIC && tag.equals("em")) {
- tagStart = s.getSpanStart(ss[i]);
- tagEnd = s.getSpanEnd(ss[i]);
- s.removeSpan(ss[i]);
- s.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), tagStart, tagEnd,
+ if (styleSpan.getStyle() == Typeface.ITALIC && tag.equals("em")) {
+ tagStart = s.getSpanStart(styleSpan);
+ tagEnd = s.getSpanEnd(styleSpan);
+ s.removeSpan(styleSpan);
+ s.setSpan(new StyleSpan(Typeface.ITALIC), tagStart, tagEnd,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
} else if (tag.equals("u")) {
WPUnderlineSpan[] us = s.getSpans(mStyleStart - 1, mStyleStart, WPUnderlineSpan.class);
- for (int i = 0; i < us.length; i++) {
- int tagStart = s.getSpanStart(us[i]);
- int tagEnd = s.getSpanEnd(us[i]);
- s.removeSpan(us[i]);
+ for (WPUnderlineSpan underlineSpan : us) {
+ int tagStart = s.getSpanStart(underlineSpan);
+ int tagEnd = s.getSpanEnd(underlineSpan);
+ s.removeSpan(underlineSpan);
s.setSpan(new WPUnderlineSpan(), tagStart, tagEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
} else if (tag.equals("strike")) {
StrikethroughSpan[] ss = s.getSpans(mStyleStart - 1, mStyleStart, StrikethroughSpan.class);
- for (int i = 0; i < ss.length; i++) {
- int tagStart = s.getSpanStart(ss[i]);
- int tagEnd = s.getSpanEnd(ss[i]);
- s.removeSpan(ss[i]);
+ for (StrikethroughSpan strikethroughSpan : ss) {
+ int tagStart = s.getSpanStart(strikethroughSpan);
+ int tagEnd = s.getSpanEnd(strikethroughSpan);
+ s.removeSpan(strikethroughSpan);
s.setSpan(new StrikethroughSpan(), tagStart, tagEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
} else if (tag.equals("blockquote")) {
QuoteSpan[] ss = s.getSpans(mStyleStart - 1, mStyleStart, QuoteSpan.class);
- for (int i = 0; i < ss.length; i++) {
- int tagStart = s.getSpanStart(ss[i]);
- int tagEnd = s.getSpanEnd(ss[i]);
- s.removeSpan(ss[i]);
+ for (QuoteSpan quoteSpan : ss) {
+ int tagStart = s.getSpanStart(quoteSpan);
+ int tagEnd = s.getSpanEnd(quoteSpan);
+ s.removeSpan(quoteSpan);
s.setSpan(new QuoteSpan(), tagStart, tagEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
@@ -1134,9 +1225,6 @@ private void formatBtnClick(ToggleButton toggleButton, String tag) {
mContentEditText.setSelection(selectionEnd + endTag.length());
}
}
- } catch (Exception e) {
- e.printStackTrace();
- }
}
/**
@@ -1169,6 +1257,8 @@ public boolean onTouch(View v, MotionEvent event) {
int charPosition = layout.getOffsetForHorizontal(line, x);
final Spannable s = mContentEditText.getText();
+ if (s == null)
+ return false;
// check if image span was tapped
WPImageSpan[] image_spans = s.getSpans(charPosition, charPosition, WPImageSpan.class);
@@ -1177,6 +1267,8 @@ public boolean onTouch(View v, MotionEvent event) {
if (!span.isVideo()) {
LayoutInflater factory = LayoutInflater.from(getActivity());
final View alertView = factory.inflate(R.layout.alert_image_options, null);
+ if (alertView == null)
+ return false;
final EditText imageWidthText = (EditText) alertView.findViewById(R.id.imageWidthText);
final EditText titleText = (EditText) alertView.findViewById(R.id.title);
// final EditText descText = (EditText)
@@ -1276,19 +1368,20 @@ public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
.setView(alertView).setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
- span.setTitle(titleText.getText().toString());
+ String title = (titleText.getText() != null) ? titleText.getText().toString() : "";
+ span.setTitle(title);
// span.setDescription(descText.getText().toString());
span.setHorizontalAlignment(alignmentSpinner.getSelectedItemPosition());
span.setWidth(getEditTextIntegerClamped(imageWidthText, 10, maxWidth));
- span.setCaption(caption.getText().toString());
+ String captionText = (caption.getText() != null) ? caption.getText().toString() : "";
+ span.setCaption(captionText);
span.setFeatured(featuredCheckBox.isChecked());
if (featuredCheckBox.isChecked()) {
// remove featured flag from all
// other images
WPImageSpan[] click_spans = s.getSpans(0, s.length(), WPImageSpan.class);
if (click_spans.length > 1) {
- for (int i = 0; i < click_spans.length; i++) {
- WPImageSpan verifySpan = click_spans[i];
+ for (WPImageSpan verifySpan : click_spans) {
if (verifySpan != span) {
verifySpan.setFeatured(false);
verifySpan.setFeaturedInPost(false);
@@ -1312,8 +1405,8 @@ public void onClick(DialogInterface dialog, int whichButton) {
} else {
mContentEditText.setMovementMethod(ArrowKeyMovementMethod.getInstance());
int selectionStart = mContentEditText.getSelectionStart();
- if (selectionStart >= 0 && mContentEditText.getSelectionEnd() >= selectionStart);
- mContentEditText.setSelection(selectionStart, mContentEditText.getSelectionEnd());
+ if (selectionStart >= 0 && mContentEditText.getSelectionEnd() >= selectionStart)
+ mContentEditText.setSelection(selectionStart, mContentEditText.getSelectionEnd());
}
// get media gallery spans
@@ -1348,12 +1441,12 @@ public void afterTextChanged(Editable s) {
if (mStyleStart > position) {
mStyleStart = position - 1;
}
- boolean exists = false;
+ boolean exists;
if (mBoldToggleButton.isChecked()) {
StyleSpan[] ss = s.getSpans(mStyleStart, position, StyleSpan.class);
exists = false;
- for (int i = 0; i < ss.length; i++) {
- if (ss[i].getStyle() == android.graphics.Typeface.BOLD) {
+ for (StyleSpan styleSpan : ss) {
+ if (styleSpan.getStyle() == Typeface.BOLD) {
exists = true;
}
}
@@ -1363,8 +1456,8 @@ public void afterTextChanged(Editable s) {
if (mEmToggleButton.isChecked()) {
StyleSpan[] ss = s.getSpans(mStyleStart, position, StyleSpan.class);
exists = false;
- for (int i = 0; i < ss.length; i++) {
- if (ss[i].getStyle() == android.graphics.Typeface.ITALIC) {
+ for (StyleSpan styleSpan : ss) {
+ if (styleSpan.getStyle() == Typeface.ITALIC) {
exists = true;
}
}
@@ -1375,8 +1468,8 @@ public void afterTextChanged(Editable s) {
if (mEmToggleButton.isChecked()) {
StyleSpan[] ss = s.getSpans(mStyleStart, position, StyleSpan.class);
exists = false;
- for (int i = 0; i < ss.length; i++) {
- if (ss[i].getStyle() == android.graphics.Typeface.ITALIC) {
+ for (StyleSpan styleSpan : ss) {
+ if (styleSpan.getStyle() == Typeface.ITALIC) {
exists = true;
}
}
@@ -1386,29 +1479,19 @@ public void afterTextChanged(Editable s) {
}
if (mUnderlineToggleButton.isChecked()) {
WPUnderlineSpan[] ss = s.getSpans(mStyleStart, position, WPUnderlineSpan.class);
- exists = false;
- for (int i = 0; i < ss.length; i++) {
- exists = true;
- }
+ exists = (ss.length > 0);
if (!exists)
s.setSpan(new WPUnderlineSpan(), mStyleStart, position, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
}
if (mStrikeToggleButton.isChecked()) {
StrikethroughSpan[] ss = s.getSpans(mStyleStart, position, StrikethroughSpan.class);
- exists = false;
- for (int i = 0; i < ss.length; i++) {
- exists = true;
- }
+ exists = (ss.length > 0);
if (!exists)
s.setSpan(new StrikethroughSpan(), mStyleStart, position, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
}
if (mBquoteToggleButton.isChecked()) {
-
QuoteSpan[] ss = s.getSpans(mStyleStart, position, QuoteSpan.class);
- exists = false;
- for (int i = 0; i < ss.length; i++) {
- exists = true;
- }
+ exists = (ss.length > 0);
if (!exists)
s.setSpan(new QuoteSpan(), mStyleStart, position, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
}
@@ -1420,10 +1503,7 @@ public void afterTextChanged(Editable s) {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
- if ((count - after == 1) || (s.length() == 0))
- mIsBackspace = true;
- else
- mIsBackspace = false;
+ mIsBackspace = (count - after == 1) || (s.length() == 0);
}
@Override
@@ -1436,6 +1516,8 @@ public void onSelectionChanged() {
return;
final Spannable s = mContentEditText.getText();
+ if (s == null)
+ return;
// set toggle buttons if cursor is inside of a matching span
mStyleStart = mContentEditText.getSelectionStart();
Object[] spans = s.getSpans(mContentEditText.getSelectionStart(), mContentEditText.getSelectionStart(), Object.class);
@@ -1470,8 +1552,10 @@ public void onSelectionChanged() {
private int getEditTextIntegerClamped(EditText editText, int min, int max) {
int width = 10;
try {
- width = Integer.parseInt(editText.getText().toString().replace("px", ""));
+ if (editText.getText() != null)
+ width = Integer.parseInt(editText.getText().toString().replace("px", ""));
} catch (NumberFormatException e) {
+ e.printStackTrace();
}
width = Math.min(max, Math.max(width, min));
return width;
From db28c9e3b4edd5aa502b5711ce9f433cd535b541 Mon Sep 17 00:00:00 2001
From: Dan Roundhill
Date: Fri, 22 Nov 2013 13:30:58 -0800
Subject: [PATCH 07/43] Sharing intent fixes
---
src/org/wordpress/android/models/Post.java | 1 +
.../ui/ShareIntentReceiverActivity.java | 5 +++--
.../android/ui/posts/NewEditPostActivity.java | 21 ++++++++++++++++---
.../android/ui/posts/PostsActivity.java | 5 ++++-
4 files changed, 26 insertions(+), 6 deletions(-)
diff --git a/src/org/wordpress/android/models/Post.java b/src/org/wordpress/android/models/Post.java
index 96d4ff2c60a6..257ae2cac0ff 100644
--- a/src/org/wordpress/android/models/Post.java
+++ b/src/org/wordpress/android/models/Post.java
@@ -103,6 +103,7 @@ public Post(int blogId, boolean isPage) {
// creates a new, empty post for the passed in blogId
this(blogId, "", "", "", "", 0, "", "", "","", 0, 0, isPage, "", true, false);
this.localDraft = true;
+ save();
}
public Post(int blog_id, String title, String content, String excerpt, String picturePaths, long date, String categories, String tags, String status,
diff --git a/src/org/wordpress/android/ui/ShareIntentReceiverActivity.java b/src/org/wordpress/android/ui/ShareIntentReceiverActivity.java
index 2373cc5d3723..5bc91c83154a 100644
--- a/src/org/wordpress/android/ui/ShareIntentReceiverActivity.java
+++ b/src/org/wordpress/android/ui/ShareIntentReceiverActivity.java
@@ -24,6 +24,7 @@
import org.wordpress.android.ui.accounts.WelcomeActivity;
import org.wordpress.android.ui.media.MediaBrowserActivity;
import org.wordpress.android.ui.posts.EditPostActivity;
+import org.wordpress.android.ui.posts.NewEditPostActivity;
import org.wordpress.android.util.StringUtils;
/**
@@ -144,7 +145,7 @@ public void onShareClicked (View view) {
if (mActionIndex == 0) {
// new post
- intent = new Intent(this, EditPostActivity.class);
+ intent = new Intent(this, NewEditPostActivity.class);
} else if (mActionIndex == 1) {
// add to media gallery
intent = new Intent(this, MediaBrowserActivity.class);
@@ -162,7 +163,7 @@ public void onShareClicked (View view) {
ArrayList extra = getIntent().getParcelableArrayListExtra((Intent.EXTRA_STREAM));
intent.putExtra(Intent.EXTRA_STREAM, extra);
} else {
- Uri extra = (Uri) getIntent().getParcelableExtra(Intent.EXTRA_STREAM);
+ Uri extra = getIntent().getParcelableExtra(Intent.EXTRA_STREAM);
intent.putExtra(Intent.EXTRA_STREAM, extra);
}
startActivity(intent);
diff --git a/src/org/wordpress/android/ui/posts/NewEditPostActivity.java b/src/org/wordpress/android/ui/posts/NewEditPostActivity.java
index be4c1e4fba35..7cffc5cd6838 100644
--- a/src/org/wordpress/android/ui/posts/NewEditPostActivity.java
+++ b/src/org/wordpress/android/ui/posts/NewEditPostActivity.java
@@ -22,6 +22,7 @@
import android.widget.TextView;
import android.widget.Toast;
+import org.wordpress.android.Constants;
import org.wordpress.android.R;
import org.wordpress.android.WordPress;
import org.wordpress.android.models.Post;
@@ -125,6 +126,20 @@ public void onPageSelected(int position) {
finish();
}
}
+
+ // Check for Android share action
+ // If it is a share action, create a new post
+ String action = getIntent().getAction();
+ if (Intent.ACTION_SEND.equals(action) || Intent.ACTION_SEND_MULTIPLE.equals(action)
+ || EditPostContentFragment.NEW_MEDIA_GALLERY.equals(action)
+ || EditPostContentFragment.NEW_MEDIA_POST.equals(action)
+ || (extras != null && extras.getInt("quick-media", -1) > -1)) {
+ mPost = new Post(WordPress.getCurrentBlog().getId(), false);
+ if (mPost.getId() < 0) {
+ // TODO: uh oh, error
+ finish();
+ }
+ }
}
@Override
@@ -167,7 +182,7 @@ else if (mQuickMediaType == Constants.QUICK_POST_VIDEO_CAMERA || mQuickMediaType
finish();
return true;
} else if (itemId == android.R.id.home) {
- showCancelAlert(true);
+ showCancelAlert();
return true;
}
return false;
@@ -187,10 +202,10 @@ private void savePost() {
@Override
public void onBackPressed() {
- showCancelAlert(false);
+ showCancelAlert();
}
- private void showCancelAlert(final boolean isUpPress) {
+ private void showCancelAlert() {
// Empty post? Let's not prompt then.
if (mEditPostContentFragment != null && mEditPostContentFragment.hasEmptyContentFields()) {
if (mIsNewPost)
diff --git a/src/org/wordpress/android/ui/posts/PostsActivity.java b/src/org/wordpress/android/ui/posts/PostsActivity.java
index 8623e249d29a..f1ac5781b5e4 100644
--- a/src/org/wordpress/android/ui/posts/PostsActivity.java
+++ b/src/org/wordpress/android/ui/posts/PostsActivity.java
@@ -314,7 +314,10 @@ public boolean onCreateOptionsMenu(Menu menu) {
public void newPost() {
// Create a new post object
Post newPost = new Post(WordPress.getCurrentBlog().getId(), isPage);
- newPost.save();
+ if (newPost.getId() < 0) {
+ // TODO: Post wasn't created, show error
+ return;
+ }
Intent i = new Intent(this, NewEditPostActivity.class);
i.putExtra(NewEditPostActivity.EXTRA_POSTID, newPost.getId());
i.putExtra(NewEditPostActivity.EXTRA_IS_PAGE, isPage);
From 05bdade382aefea3cca40e14fcef434be998f2d5 Mon Sep 17 00:00:00 2001
From: Dan Roundhill
Date: Fri, 22 Nov 2013 13:31:56 -0800
Subject: [PATCH 08/43] Simplified code that was checking span styles after the
user typed. Just loop through all spans instead of checking for each
individual class.
---
.../ui/posts/EditPostContentFragment.java | 108 +++++++-----------
1 file changed, 42 insertions(+), 66 deletions(-)
diff --git a/src/org/wordpress/android/ui/posts/EditPostContentFragment.java b/src/org/wordpress/android/ui/posts/EditPostContentFragment.java
index 31821c7efbd7..ca1a8d8e184b 100644
--- a/src/org/wordpress/android/ui/posts/EditPostContentFragment.java
+++ b/src/org/wordpress/android/ui/posts/EditPostContentFragment.java
@@ -1427,77 +1427,53 @@ public void onClick(DialogInterface dialog, int whichButton) {
@Override
public void afterTextChanged(Editable s) {
- try {
- int position = Selection.getSelectionStart(mContentEditText.getText());
- if ((mIsBackspace && position != 1) || mLastPosition == position || !mPost.isLocalDraft())
- return;
+ int position = Selection.getSelectionStart(mContentEditText.getText());
+ if ((mIsBackspace && position != 1) || mLastPosition == position || !mPost.isLocalDraft())
+ return;
- if (position < 0) {
- position = 0;
+ if (position < 0) {
+ position = 0;
+ }
+ mLastPosition = position;
+ if (position > 0) {
+
+ if (mStyleStart > position) {
+ mStyleStart = position - 1;
}
- mLastPosition = position;
- if (position > 0) {
- if (mStyleStart > position) {
- mStyleStart = position - 1;
- }
- boolean exists;
- if (mBoldToggleButton.isChecked()) {
- StyleSpan[] ss = s.getSpans(mStyleStart, position, StyleSpan.class);
- exists = false;
- for (StyleSpan styleSpan : ss) {
- if (styleSpan.getStyle() == Typeface.BOLD) {
- exists = true;
- }
- }
- if (!exists)
- s.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), mStyleStart, position, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
- }
- if (mEmToggleButton.isChecked()) {
- StyleSpan[] ss = s.getSpans(mStyleStart, position, StyleSpan.class);
- exists = false;
- for (StyleSpan styleSpan : ss) {
- if (styleSpan.getStyle() == Typeface.ITALIC) {
- exists = true;
- }
- }
- if (!exists)
- s.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), mStyleStart, position,
- Spannable.SPAN_INCLUSIVE_INCLUSIVE);
- }
- if (mEmToggleButton.isChecked()) {
- StyleSpan[] ss = s.getSpans(mStyleStart, position, StyleSpan.class);
- exists = false;
- for (StyleSpan styleSpan : ss) {
- if (styleSpan.getStyle() == Typeface.ITALIC) {
- exists = true;
- }
- }
- if (!exists)
- s.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), mStyleStart, position,
- Spannable.SPAN_INCLUSIVE_INCLUSIVE);
- }
- if (mUnderlineToggleButton.isChecked()) {
- WPUnderlineSpan[] ss = s.getSpans(mStyleStart, position, WPUnderlineSpan.class);
- exists = (ss.length > 0);
- if (!exists)
- s.setSpan(new WPUnderlineSpan(), mStyleStart, position, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
- }
- if (mStrikeToggleButton.isChecked()) {
- StrikethroughSpan[] ss = s.getSpans(mStyleStart, position, StrikethroughSpan.class);
- exists = (ss.length > 0);
- if (!exists)
- s.setSpan(new StrikethroughSpan(), mStyleStart, position, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
- }
- if (mBquoteToggleButton.isChecked()) {
- QuoteSpan[] ss = s.getSpans(mStyleStart, position, QuoteSpan.class);
- exists = (ss.length > 0);
- if (!exists)
- s.setSpan(new QuoteSpan(), mStyleStart, position, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
+ boolean shouldBold = mBoldToggleButton.isChecked();
+ boolean shouldEm = mEmToggleButton.isChecked();
+ boolean shouldUnderline = mUnderlineToggleButton.isChecked();
+ boolean shouldStrike = mStrikeToggleButton.isChecked();
+ boolean shouldQuote = mBquoteToggleButton.isChecked();
+
+ Object[] allSpans = s.getSpans(mStyleStart, position, Object.class);
+ for (Object span : allSpans) {
+ if (span instanceof StyleSpan) {
+ StyleSpan styleSpan = (StyleSpan) span;
+ if (styleSpan.getStyle() == Typeface.BOLD)
+ shouldBold = false;
+ else if (styleSpan.getStyle() == Typeface.ITALIC)
+ shouldEm = false;
+ else if (span instanceof WPUnderlineSpan)
+ shouldUnderline = false;
+ else if (span instanceof StrikethroughSpan)
+ shouldStrike = false;
+ else if (span instanceof QuoteSpan)
+ shouldQuote = false;
}
}
- } catch (Exception e) {
- e.printStackTrace();
+
+ if (shouldBold)
+ s.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), mStyleStart, position, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
+ if (shouldEm)
+ s.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), mStyleStart, position, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
+ if (shouldUnderline)
+ s.setSpan(new WPUnderlineSpan(), mStyleStart, position, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
+ if (shouldStrike)
+ s.setSpan(new StrikethroughSpan(), mStyleStart, position, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
+ if (shouldQuote)
+ s.setSpan(new QuoteSpan(), mStyleStart, position, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
}
}
From eabcc6cdc3f9ef1009ee72344721d763a88352a0 Mon Sep 17 00:00:00 2001
From: Dan Roundhill
Date: Fri, 22 Nov 2013 16:38:48 -0800
Subject: [PATCH 09/43] =?UTF-8?q?Optimized=20the=20=E2=80=98formatBtnClick?=
=?UTF-8?q?=E2=80=99=20method=20(renamed=20it=20too!)=20to=20use=20way=20f?=
=?UTF-8?q?ar=20less=20code=20but=20accomplish=20the=20same=20task.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../ui/posts/EditPostContentFragment.java | 247 +++++++-----------
1 file changed, 92 insertions(+), 155 deletions(-)
diff --git a/src/org/wordpress/android/ui/posts/EditPostContentFragment.java b/src/org/wordpress/android/ui/posts/EditPostContentFragment.java
index ca1a8d8e184b..9300d0176620 100644
--- a/src/org/wordpress/android/ui/posts/EditPostContentFragment.java
+++ b/src/org/wordpress/android/ui/posts/EditPostContentFragment.java
@@ -98,6 +98,12 @@ public class EditPostContentFragment extends SherlockFragment implements TextWat
public static final String NEW_MEDIA_POST = "NEW_MEDIA_POST";
public static final String NEW_MEDIA_POST_EXTRA = "NEW_MEDIA_POST_ID";
+ private static final String TAG_FORMAT_BAR_BUTTON_STRONG = "strong";
+ private static final String TAG_FORMAT_BAR_BUTTON_EM = "em";
+ private static final String TAG_FORMAT_BAR_BUTTON_UNDERLINE = "u";
+ private static final String TAG_FORMAT_BAR_BUTTON_STRIKE = "strike";
+ private static final String TAG_FORMAT_BAR_BUTTON_QUOTE = "blockquote";
+
private Post mPost;
private WPEditText mContentEditText;
@@ -1024,15 +1030,15 @@ private boolean addMedia(Uri imageUri, SpannableStringBuilder ssb) {
public void onClick(View v) {
int id = v.getId();
if (id == R.id.bold) {
- formatBtnClick(mBoldToggleButton, "strong");
+ onFormatButtonClick(mBoldToggleButton, TAG_FORMAT_BAR_BUTTON_STRONG);
} else if (id == R.id.em) {
- formatBtnClick(mEmToggleButton, "em");
+ onFormatButtonClick(mEmToggleButton, TAG_FORMAT_BAR_BUTTON_EM);
} else if (id == R.id.underline) {
- formatBtnClick(mUnderlineToggleButton, "u");
+ onFormatButtonClick(mUnderlineToggleButton, TAG_FORMAT_BAR_BUTTON_UNDERLINE);
} else if (id == R.id.strike) {
- formatBtnClick(mStrikeToggleButton, "strike");
+ onFormatButtonClick(mStrikeToggleButton, TAG_FORMAT_BAR_BUTTON_STRIKE);
} else if (id == R.id.bquote) {
- formatBtnClick(mBquoteToggleButton, "blockquote");
+ onFormatButtonClick(mBquoteToggleButton, TAG_FORMAT_BAR_BUTTON_QUOTE);
} else if (id == R.id.more) {
mSelectionEnd = mContentEditText.getSelectionEnd();
Editable str = mContentEditText.getText();
@@ -1061,7 +1067,13 @@ public void onClick(View v) {
}
};
- private void formatBtnClick(ToggleButton toggleButton, String tag) {
+ /**
+ * Applies formatting to selected text, or marks the entry for a new text style
+ * at the current cursor position
+ * @param toggleButton button from formatting bar
+ * @param tag HTML tag name for text style
+ */
+ private void onFormatButtonClick(ToggleButton toggleButton, String tag) {
Spannable s = mContentEditText.getText();
if (s == null)
return;
@@ -1075,156 +1087,81 @@ private void formatBtnClick(ToggleButton toggleButton, String tag) {
selectionStart = temp;
}
- if (mPost.isLocalDraft()) {
- if (selectionEnd > selectionStart) {
- Spannable str = mContentEditText.getText();
- if (tag.equals("strong")) {
- StyleSpan[] ss = str.getSpans(selectionStart, selectionEnd, StyleSpan.class);
-
- boolean exists = false;
- for (StyleSpan styleSpan : ss) {
- int style = styleSpan.getStyle();
- if (style == Typeface.BOLD) {
- str.removeSpan(styleSpan);
- exists = true;
- }
- }
-
- if (!exists) {
- str.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), selectionStart, selectionEnd,
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- }
- toggleButton.setChecked(false);
- } else if (tag.equals("em")) {
- StyleSpan[] ss = str.getSpans(selectionStart, selectionEnd, StyleSpan.class);
-
- boolean exists = false;
- for (StyleSpan styleSpan : ss) {
- int style = styleSpan.getStyle();
- if (style == Typeface.ITALIC) {
- str.removeSpan(styleSpan);
- exists = true;
- }
- }
-
- if (!exists) {
- str.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), selectionStart, selectionEnd,
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- }
- toggleButton.setChecked(false);
- } else if (tag.equals("u")) {
-
- WPUnderlineSpan[] ss = str.getSpans(selectionStart, selectionEnd, WPUnderlineSpan.class);
-
- boolean exists = false;
- for (WPUnderlineSpan underlineSpan : ss) {
- str.removeSpan(underlineSpan);
- exists = true;
- }
-
- if (!exists) {
- str.setSpan(new WPUnderlineSpan(), selectionStart, selectionEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- }
-
- toggleButton.setChecked(false);
- } else if (tag.equals("strike")) {
-
- StrikethroughSpan[] ss = str.getSpans(selectionStart, selectionEnd, StrikethroughSpan.class);
-
- boolean exists = false;
- for (StrikethroughSpan strikethroughSpan : ss) {
- str.removeSpan(strikethroughSpan);
- exists = true;
- }
-
- if (!exists) {
- str.setSpan(new StrikethroughSpan(), selectionStart, selectionEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- }
-
- toggleButton.setChecked(false);
- } else if (tag.equals("blockquote")) {
-
- QuoteSpan[] ss = str.getSpans(selectionStart, selectionEnd, QuoteSpan.class);
-
- boolean exists = false;
- for (QuoteSpan quoteSpan : ss) {
- str.removeSpan(quoteSpan);
- exists = true;
- }
-
- if (!exists) {
- str.setSpan(new QuoteSpan(), selectionStart, selectionEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- }
+ Class styleClass = null;
+ if (tag.equals(TAG_FORMAT_BAR_BUTTON_STRONG) || tag.equals(TAG_FORMAT_BAR_BUTTON_EM))
+ styleClass = StyleSpan.class;
+ else if (tag.equals(TAG_FORMAT_BAR_BUTTON_UNDERLINE))
+ styleClass = WPUnderlineSpan.class;
+ else if (tag.equals(TAG_FORMAT_BAR_BUTTON_STRIKE))
+ styleClass = StrikethroughSpan.class;
+ else if (tag.equals(TAG_FORMAT_BAR_BUTTON_QUOTE))
+ styleClass = QuoteSpan.class;
+
+ if (styleClass == null)
+ return;
- toggleButton.setChecked(false);
+ Object[] allSpans = s.getSpans(selectionStart, selectionEnd, styleClass);
+ boolean textIsSelected = selectionEnd > selectionStart;
+ if (mPost.isLocalDraft()) {
+ // Local drafts can use the rich text editor. Yay!
+ boolean shouldAddSpan = true;
+ for (Object span : allSpans) {
+ if (span instanceof StyleSpan) {
+ StyleSpan styleSpan = (StyleSpan)span;
+ if ((styleSpan.getStyle() == Typeface.BOLD && !tag.equals(TAG_FORMAT_BAR_BUTTON_STRONG))
+ || (styleSpan.getStyle() == Typeface.ITALIC && !tag.equals(TAG_FORMAT_BAR_BUTTON_EM))) {
+ continue;
}
+ }
+ if (!toggleButton.isChecked() && textIsSelected) {
+ // If span exists and text is selected, remove the span
+ s.removeSpan(span);
+ shouldAddSpan = false;
+ break;
} else if (!toggleButton.isChecked()) {
-
- if (tag.equals("strong") || tag.equals("em")) {
-
- StyleSpan[] ss = s.getSpans(mStyleStart - 1, mStyleStart, StyleSpan.class);
-
- for (StyleSpan styleSpan : ss) {
- int tagStart;
- int tagEnd;
- if (styleSpan.getStyle() == Typeface.BOLD && tag.equals("strong")) {
- tagStart = s.getSpanStart(styleSpan);
- tagEnd = s.getSpanEnd(styleSpan);
- s.removeSpan(styleSpan);
- s.setSpan(new StyleSpan(Typeface.BOLD), tagStart, tagEnd,
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- }
- if (styleSpan.getStyle() == Typeface.ITALIC && tag.equals("em")) {
- tagStart = s.getSpanStart(styleSpan);
- tagEnd = s.getSpanEnd(styleSpan);
- s.removeSpan(styleSpan);
- s.setSpan(new StyleSpan(Typeface.ITALIC), tagStart, tagEnd,
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- }
- }
- } else if (tag.equals("u")) {
- WPUnderlineSpan[] us = s.getSpans(mStyleStart - 1, mStyleStart, WPUnderlineSpan.class);
- for (WPUnderlineSpan underlineSpan : us) {
- int tagStart = s.getSpanStart(underlineSpan);
- int tagEnd = s.getSpanEnd(underlineSpan);
- s.removeSpan(underlineSpan);
- s.setSpan(new WPUnderlineSpan(), tagStart, tagEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- }
- } else if (tag.equals("strike")) {
- StrikethroughSpan[] ss = s.getSpans(mStyleStart - 1, mStyleStart, StrikethroughSpan.class);
- for (StrikethroughSpan strikethroughSpan : ss) {
- int tagStart = s.getSpanStart(strikethroughSpan);
- int tagEnd = s.getSpanEnd(strikethroughSpan);
- s.removeSpan(strikethroughSpan);
- s.setSpan(new StrikethroughSpan(), tagStart, tagEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- }
- } else if (tag.equals("blockquote")) {
- QuoteSpan[] ss = s.getSpans(mStyleStart - 1, mStyleStart, QuoteSpan.class);
- for (QuoteSpan quoteSpan : ss) {
- int tagStart = s.getSpanStart(quoteSpan);
- int tagEnd = s.getSpanEnd(quoteSpan);
- s.removeSpan(quoteSpan);
- s.setSpan(new QuoteSpan(), tagStart, tagEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- }
+ // Sets span at cursor, so span styling is set as the user types
+ Object[] spans = s.getSpans(mStyleStart - 1, mStyleStart, styleClass);
+ for (Object removeSpan : spans) {
+ selectionStart = s.getSpanStart(removeSpan);
+ selectionEnd = s.getSpanEnd(removeSpan);
+ s.removeSpan(removeSpan);
}
}
- } else {
- String startTag = "<" + tag + ">";
- String endTag = "" + tag + ">";
- Editable content = mContentEditText.getText();
- if (selectionEnd > selectionStart) {
- content.insert(selectionStart, startTag);
- content.insert(selectionEnd + startTag.length(), endTag);
- toggleButton.setChecked(false);
- mContentEditText.setSelection(selectionEnd + startTag.length() + endTag.length());
- } else if (toggleButton.isChecked()) {
- content.insert(selectionStart, startTag);
- mContentEditText.setSelection(selectionEnd + startTag.length());
- } else if (!toggleButton.isChecked()) {
- content.insert(selectionEnd, endTag);
- mContentEditText.setSelection(selectionEnd + endTag.length());
+ }
+
+ if (shouldAddSpan) {
+ if (tag.equals(TAG_FORMAT_BAR_BUTTON_STRONG)) {
+ s.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), selectionStart, selectionEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+ } else if (tag.equals(TAG_FORMAT_BAR_BUTTON_EM)) {
+ s.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), selectionStart, selectionEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+ } else {
+ try {
+ s.setSpan(styleClass.newInstance(), selectionStart, selectionEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+ } catch (java.lang.InstantiationException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
}
}
+ } else {
+ // Add HTML tags when editing an existing post
+ String startTag = "<" + tag + ">";
+ String endTag = "" + tag + ">";
+ Editable content = mContentEditText.getText();
+ if (textIsSelected) {
+ content.insert(selectionStart, startTag);
+ content.insert(selectionEnd + startTag.length(), endTag);
+ toggleButton.setChecked(false);
+ mContentEditText.setSelection(selectionEnd + startTag.length() + endTag.length());
+ } else if (toggleButton.isChecked()) {
+ content.insert(selectionStart, startTag);
+ mContentEditText.setSelection(selectionEnd + startTag.length());
+ } else if (!toggleButton.isChecked()) {
+ content.insert(selectionEnd, endTag);
+ mContentEditText.setSelection(selectionEnd + endTag.length());
+ }
+ }
}
/**
@@ -1455,12 +1392,12 @@ public void afterTextChanged(Editable s) {
shouldBold = false;
else if (styleSpan.getStyle() == Typeface.ITALIC)
shouldEm = false;
- else if (span instanceof WPUnderlineSpan)
- shouldUnderline = false;
- else if (span instanceof StrikethroughSpan)
- shouldStrike = false;
- else if (span instanceof QuoteSpan)
- shouldQuote = false;
+ } else if (span instanceof WPUnderlineSpan) {
+ shouldUnderline = false;
+ } else if (span instanceof StrikethroughSpan) {
+ shouldStrike = false;
+ } else if (span instanceof QuoteSpan) {
+ shouldQuote = false;
}
}
From b7c2e4049994a55b1a2eb1f28339ec58b5619dd3 Mon Sep 17 00:00:00 2001
From: Dan Roundhill
Date: Fri, 22 Nov 2013 16:44:50 -0800
Subject: [PATCH 10/43] Comment fix.
---
src/org/wordpress/android/ui/posts/EditPostContentFragment.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/org/wordpress/android/ui/posts/EditPostContentFragment.java b/src/org/wordpress/android/ui/posts/EditPostContentFragment.java
index 9300d0176620..681388db055f 100644
--- a/src/org/wordpress/android/ui/posts/EditPostContentFragment.java
+++ b/src/org/wordpress/android/ui/posts/EditPostContentFragment.java
@@ -1119,7 +1119,7 @@ else if (tag.equals(TAG_FORMAT_BAR_BUTTON_QUOTE))
shouldAddSpan = false;
break;
} else if (!toggleButton.isChecked()) {
- // Sets span at cursor, so span styling is set as the user types
+ // Remove span at cursor point if button isn't checked
Object[] spans = s.getSpans(mStyleStart - 1, mStyleStart, styleClass);
for (Object removeSpan : spans) {
selectionStart = s.getSpanStart(removeSpan);
From 07413a67c0eaad5f84a97f13b9a8b72411a86d51 Mon Sep 17 00:00:00 2001
From: Dan Roundhill
Date: Mon, 25 Nov 2013 12:36:51 -0800
Subject: [PATCH 11/43] Editor changes:
* ActionBar now hides when full screen editing.
* Dismissing soft keyboard when full screen editing will dismiss the full screen editor.
* Animation improvements.
---
res/layout/activity_new_edit_post.xml | 2 +-
res/layout/fragment_edit_post_content.xml | 66 +++++++++++-------
.../ui/posts/EditPostContentFragment.java | 69 +++++++++----------
.../android/ui/posts/NewEditPostActivity.java | 27 ++++----
4 files changed, 89 insertions(+), 75 deletions(-)
diff --git a/res/layout/activity_new_edit_post.xml b/res/layout/activity_new_edit_post.xml
index bc9db83670b5..1aeec4830fd0 100644
--- a/res/layout/activity_new_edit_post.xml
+++ b/res/layout/activity_new_edit_post.xml
@@ -1,4 +1,4 @@
-
-
-
-
+ android:orientation="vertical"
+ android:fillViewport="true"
+ android:layout_weight="1">
+
+
+
+
+
+
+
+
+
Date: Tue, 26 Nov 2013 11:46:47 -0800
Subject: [PATCH 12/43] Remove now unused action bar layout.
---
res/layout/edit_post_content_action_bar.xml | 20 --------------------
1 file changed, 20 deletions(-)
delete mode 100644 res/layout/edit_post_content_action_bar.xml
diff --git a/res/layout/edit_post_content_action_bar.xml b/res/layout/edit_post_content_action_bar.xml
deleted file mode 100644
index 51576cc96159..000000000000
--- a/res/layout/edit_post_content_action_bar.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
From 6198f9a8166578e16e97720dff646cf9faa42eeb Mon Sep 17 00:00:00 2001
From: Dan Roundhill
Date: Tue, 26 Nov 2013 11:47:17 -0800
Subject: [PATCH 13/43] Pass correct context to getPostFormatsTask(). Fixes
force close.
---
.../wordpress/android/ui/posts/EditPostSettingsFragment.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/org/wordpress/android/ui/posts/EditPostSettingsFragment.java b/src/org/wordpress/android/ui/posts/EditPostSettingsFragment.java
index de266613b9bf..bafe6c5edfe3 100644
--- a/src/org/wordpress/android/ui/posts/EditPostSettingsFragment.java
+++ b/src/org/wordpress/android/ui/posts/EditPostSettingsFragment.java
@@ -168,7 +168,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container,
if (mActivity.getPost().getBlog().getPostFormats().equals("")) {
List args = new Vector();
args.add(mActivity.getPost().getBlog());
- args.add(this);
+ args.add(mActivity);
new ApiHelper.getPostFormatsTask().execute(args);
mPostFormatTitles = getResources().getStringArray(R.array.post_formats_array);
String defaultPostFormatTitles[] = {"aside", "audio", "chat", "gallery", "image", "link", "quote", "standard", "status", "video"};
From a6db771a0954a1883a9ce948ddd59504e5808723 Mon Sep 17 00:00:00 2001
From: Dan Roundhill
Date: Tue, 26 Nov 2013 12:22:13 -0800
Subject: [PATCH 14/43] Fixed some warnings and code formatting in
EditPostSettingsFragment
---
.../ui/posts/EditPostSettingsFragment.java | 67 +++++++++++--------
1 file changed, 39 insertions(+), 28 deletions(-)
diff --git a/src/org/wordpress/android/ui/posts/EditPostSettingsFragment.java b/src/org/wordpress/android/ui/posts/EditPostSettingsFragment.java
index bafe6c5edfe3..9081d2e782ad 100644
--- a/src/org/wordpress/android/ui/posts/EditPostSettingsFragment.java
+++ b/src/org/wordpress/android/ui/posts/EditPostSettingsFragment.java
@@ -68,7 +68,6 @@ public class EditPostSettingsFragment extends SherlockFragment implements View.O
private Spinner mStatusSpinner;
private EditText mPasswordEditText, mTagsEditText, mExcerptEditText;
private TextView mLocationText, mPubDateText;
- private Button mPubDateButton;
private ViewGroup mSectionCategories;
private ArrayList mCategories;
@@ -83,7 +82,7 @@ public class EditPostSettingsFragment extends SherlockFragment implements View.O
private String[] mPostFormats;
private String[] mPostFormatTitles;
- private static enum LocationStatus { NONE, FOUND, NOT_FOUND, SEARCHING }
+ private static enum LocationStatus {NONE, FOUND, NOT_FOUND, SEARCHING}
@Override
public void onClick(View v) {
@@ -138,12 +137,15 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container,
ViewGroup rootView = (ViewGroup) inflater
.inflate(R.layout.fragment_edit_post_settings, container, false);
+ if (rootView == null)
+ return null;
+
mActivity = (NewEditPostActivity) getActivity();
mExcerptEditText = (EditText) rootView.findViewById(R.id.postExcerpt);
mPasswordEditText = (EditText) rootView.findViewById(R.id.post_password);
mLocationText = (TextView) rootView.findViewById(R.id.locationText);
- mPubDateButton = (Button) rootView.findViewById(R.id.pubDateButton);
+ Button mPubDateButton = (Button) rootView.findViewById(R.id.pubDateButton);
mPubDateText = (TextView) rootView.findViewById(R.id.pubDate);
mStatusSpinner = (Spinner) rootView.findViewById(R.id.status);
mTagsEditText = (EditText) rootView.findViewById(R.id.tags);
@@ -151,6 +153,8 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container,
mPubDateButton.setOnClickListener(this);
+ initLocation();
+
// Set header labels to upper case
((TextView) rootView.findViewById(R.id.categoryLabel)).setText(getResources().getString(R.string.categories).toUpperCase());
((TextView) rootView.findViewById(R.id.statusLabel)).setText(getResources().getString(R.string.status).toUpperCase());
@@ -171,8 +175,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container,
args.add(mActivity);
new ApiHelper.getPostFormatsTask().execute(args);
mPostFormatTitles = getResources().getStringArray(R.array.post_formats_array);
- String defaultPostFormatTitles[] = {"aside", "audio", "chat", "gallery", "image", "link", "quote", "standard", "status", "video"};
- mPostFormats = defaultPostFormatTitles;
+ mPostFormats = new String[] {"aside", "audio", "chat", "gallery", "image", "link", "quote", "standard", "status", "video"};
} else {
try {
Gson gson = new Gson();
@@ -300,8 +303,10 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case ACTIVITY_REQUEST_CODE_SELECT_CATEGORIES:
extras = data.getExtras();
- mCategories = (ArrayList) extras.getSerializable("selectedCategories");
- populateSelectedCategories();
+ if (extras != null && extras.containsKey("selectedCategories")) {
+ mCategories = (ArrayList) extras.getSerializable("selectedCategories");
+ populateSelectedCategories();
+ }
break;
}
}
@@ -311,9 +316,9 @@ public void savePostSettings(boolean isAutoSave) {
if (mPost == null)
return;
- String password = mPasswordEditText.getText().toString();
- String pubDate = mPubDateText.getText().toString();
- String excerpt = mExcerptEditText.getText().toString();
+ String password = (mPasswordEditText.getText() != null) ? mPasswordEditText.getText().toString() : "";
+ String pubDate = (mPubDateText.getText() != null) ? mPubDateText.getText().toString() : "";
+ String excerpt = (mExcerptEditText.getText() != null) ? mExcerptEditText.getText().toString() : "";
long pubDateTimestamp = 0;
if (!pubDate.equals(getResources().getText(R.string.immediately))) {
@@ -325,7 +330,7 @@ else if (mPost.getDate_created_gmt() > 0)
String tags = "", postFormat = "";
if (!mPost.isPage()) {
- tags = mTagsEditText.getText().toString();
+ tags = (mTagsEditText.getText() != null) ? mTagsEditText.getText().toString() : "";
// post format
Spinner postFormatSpinner = (Spinner) getActivity().findViewById(R.id.postFormat);
postFormat = mPostFormats[postFormatSpinner.getSelectedItemPosition()];
@@ -404,7 +409,7 @@ protected String doInBackground(Double... args) {
addresses = gcd.getFromLocation(latitude, longitude, 1);
// addresses may be null or empty if network isn't connected
- if (addresses==null || addresses.size()==0)
+ if (addresses == null || addresses.size() == 0)
return null;
String locality = "", adminArea = "", country = "";
@@ -427,7 +432,7 @@ protected String doInBackground(Double... args) {
protected void onPostExecute(String result) {
setLocationStatus(LocationStatus.FOUND);
- if (result==null || result.isEmpty()) {
+ if (result == null || result.isEmpty()) {
// show lat/long when Geocoder fails (ugly, but better than not showing anything
// or showing an error since the location has been assigned to the post already)
mLocationText.setText(Double.toString(latitude) + ", " + Double.toString(longitude));
@@ -487,7 +492,7 @@ private void initLocation() {
* get the current location
*/
private void getLocation() {
- if (mLocationHelper==null)
+ if (mLocationHelper == null)
mLocationHelper = new LocationHelper();
boolean canGetLocation = mLocationHelper.getLocation(getActivity(), locationResult);
if (canGetLocation) {
@@ -530,9 +535,10 @@ private void removeLocation() {
*/
private void setLocationStatus(LocationStatus status) {
// animate location text when searching
- if (status==LocationStatus.SEARCHING) {
+ if (status == LocationStatus.SEARCHING) {
Animation aniBlink = AnimationUtils.loadAnimation(getActivity(), R.anim.blink);
- mLocationText.startAnimation(aniBlink);
+ if (aniBlink != null)
+ mLocationText.startAnimation(aniBlink);
} else {
mLocationText.clearAnimation();
}
@@ -548,10 +554,10 @@ private void setLocationStatus(LocationStatus status) {
case SEARCHING:
drawableId = R.drawable.ic_action_location_searching;
break;
- case NONE :
+ case NONE:
drawableId = 0;
break;
- default :
+ default:
return;
}
@@ -588,32 +594,37 @@ private void populateSelectedCategories() {
List viewsToRemove = new ArrayList();
for (int i = 0; i < mSectionCategories.getChildCount(); i++) {
View v = mSectionCategories.getChildAt(i);
+ if (v == null)
+ return;
Object tag = v.getTag();
if (tag != null && tag.getClass() == String.class &&
(((String) tag).startsWith(CATEGORY_PREFIX_TAG) || tag.equals("select-category"))) {
viewsToRemove.add(v);
}
}
- for (int i = 0; i < viewsToRemove.size(); i++) {
- mSectionCategories.removeView(viewsToRemove.get(i));
+ for (View viewToRemove : viewsToRemove) {
+ mSectionCategories.removeView(viewToRemove);
}
viewsToRemove.clear();
// New category buttons
LayoutInflater layoutInflater = getActivity().getLayoutInflater();
- for (int i = 0; i < mCategories.size(); i++) {
- String categoryName = mCategories.get(i);
+ for (String categoryName : mCategories) {
Button buttonCategory = (Button) layoutInflater.inflate(R.layout.category_button, null);
- buttonCategory.setText(Html.fromHtml(categoryName));
- buttonCategory.setTag(CATEGORY_PREFIX_TAG + categoryName);
- buttonCategory.setOnClickListener(this);
- mSectionCategories.addView(buttonCategory);
+ if (categoryName != null && buttonCategory != null) {
+ buttonCategory.setText(Html.fromHtml(categoryName));
+ buttonCategory.setTag(CATEGORY_PREFIX_TAG + categoryName);
+ buttonCategory.setOnClickListener(this);
+ mSectionCategories.addView(buttonCategory);
+ }
}
// Add select category button
Button selectCategory = (Button) layoutInflater.inflate(R.layout.category_select_button, null);
- selectCategory.setOnClickListener(this);
- mSectionCategories.addView(selectCategory);
+ if (selectCategory != null) {
+ selectCategory.setOnClickListener(this);
+ mSectionCategories.addView(selectCategory);
+ }
}
/**
From 162286b79aef68495ddecfaa9c57288eebb45306 Mon Sep 17 00:00:00 2001
From: Dan Roundhill
Date: Tue, 26 Nov 2013 13:13:08 -0800
Subject: [PATCH 15/43] Tab text color fix
---
res/values-v11/styles.xml | 1 +
res/values-v14/styles.xml | 1 +
res/values/styles.xml | 5 +++++
3 files changed, 7 insertions(+)
diff --git a/res/values-v11/styles.xml b/res/values-v11/styles.xml
index c9b364194cdb..9e51a49f1a39 100644
--- a/res/values-v11/styles.xml
+++ b/res/values-v11/styles.xml
@@ -13,6 +13,7 @@
- @drawable/cab_background_top_wordpress
- @drawable/cab_background_bottom_wordpress
- @style/ActionButton.CloseMode.WordPress
+ - @style/TabTextStyle.WordPress
- @style/Theme.WordPress.Widget
diff --git a/res/values-v14/styles.xml b/res/values-v14/styles.xml
index 4d8e233a5a13..26947457703a 100644
--- a/res/values-v14/styles.xml
+++ b/res/values-v14/styles.xml
@@ -13,6 +13,7 @@
- @drawable/cab_background_top_wordpress
- @drawable/cab_background_bottom_wordpress
- @style/ActionButton.CloseMode.WordPress
+ - @style/TabTextStyle.WordPress
- @style/Theme.WordPress.Widget
diff --git a/res/values/styles.xml b/res/values/styles.xml
index c846d803d2de..437ceccac896 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -13,6 +13,7 @@
- @drawable/cab_background_top_wordpress
- @drawable/cab_background_bottom_wordpress
- @style/ActionButton.CloseMode.WordPress
+ - @style/TabTextStyle.WordPress
- @style/Theme.WordPress.Widget
@@ -50,6 +51,10 @@
- @drawable/tab_indicator_ab_wordpress
+
+
-
@@ -110,18 +106,6 @@
- @dimen/format_bar_height
-
-
-
-
-
-
-
-
From dc601a8ff804c08f36f6ef6148ffed7dba6ef20b Mon Sep 17 00:00:00 2001
From: Isaac Keyet
Date: Fri, 6 Dec 2013 02:59:23 -0500
Subject: [PATCH 36/43] Formatting toolbar icons
Updated toolbars to unify iOS and Android formatting toolbars, ref #323
---
res/drawable-hdpi/icon_format_bold.png | Bin 0 -> 1345 bytes
res/drawable-hdpi/icon_format_italic.png | Bin 0 -> 1285 bytes
res/drawable-hdpi/icon_format_link.png | Bin 0 -> 1824 bytes
res/drawable-hdpi/icon_format_media.png | Bin 0 -> 1292 bytes
res/drawable-hdpi/icon_format_more.png | Bin 0 -> 1130 bytes
res/drawable-hdpi/icon_format_quote.png | Bin 0 -> 1772 bytes
res/drawable-hdpi/icon_format_strikethrough.png | Bin 0 -> 1615 bytes
res/drawable-hdpi/icon_format_underline.png | Bin 0 -> 1268 bytes
res/drawable-mdpi/icon_format_bold.png | Bin 0 -> 1300 bytes
res/drawable-mdpi/icon_format_italic.png | Bin 0 -> 1261 bytes
res/drawable-mdpi/icon_format_link.png | Bin 0 -> 1547 bytes
res/drawable-mdpi/icon_format_media.png | Bin 0 -> 1215 bytes
res/drawable-mdpi/icon_format_more.png | Bin 0 -> 1098 bytes
res/drawable-mdpi/icon_format_quote.png | Bin 0 -> 1497 bytes
res/drawable-mdpi/icon_format_strikethrough.png | Bin 0 -> 1394 bytes
res/drawable-mdpi/icon_format_underline.png | Bin 0 -> 1245 bytes
res/drawable-xhdpi/icon_format_bold.png | Bin 0 -> 1558 bytes
res/drawable-xhdpi/icon_format_italic.png | Bin 0 -> 1512 bytes
res/drawable-xhdpi/icon_format_link.png | Bin 0 -> 2070 bytes
res/drawable-xhdpi/icon_format_media.png | Bin 0 -> 1419 bytes
res/drawable-xhdpi/icon_format_more.png | Bin 0 -> 1169 bytes
res/drawable-xhdpi/icon_format_quote.png | Bin 0 -> 2009 bytes
res/drawable-xhdpi/icon_format_strikethrough.png | Bin 0 -> 1897 bytes
res/drawable-xhdpi/icon_format_underline.png | Bin 0 -> 1466 bytes
24 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 res/drawable-hdpi/icon_format_bold.png
create mode 100644 res/drawable-hdpi/icon_format_italic.png
create mode 100644 res/drawable-hdpi/icon_format_link.png
create mode 100644 res/drawable-hdpi/icon_format_media.png
create mode 100644 res/drawable-hdpi/icon_format_more.png
create mode 100644 res/drawable-hdpi/icon_format_quote.png
create mode 100644 res/drawable-hdpi/icon_format_strikethrough.png
create mode 100644 res/drawable-hdpi/icon_format_underline.png
create mode 100644 res/drawable-mdpi/icon_format_bold.png
create mode 100644 res/drawable-mdpi/icon_format_italic.png
create mode 100644 res/drawable-mdpi/icon_format_link.png
create mode 100644 res/drawable-mdpi/icon_format_media.png
create mode 100644 res/drawable-mdpi/icon_format_more.png
create mode 100644 res/drawable-mdpi/icon_format_quote.png
create mode 100644 res/drawable-mdpi/icon_format_strikethrough.png
create mode 100644 res/drawable-mdpi/icon_format_underline.png
create mode 100644 res/drawable-xhdpi/icon_format_bold.png
create mode 100644 res/drawable-xhdpi/icon_format_italic.png
create mode 100644 res/drawable-xhdpi/icon_format_link.png
create mode 100644 res/drawable-xhdpi/icon_format_media.png
create mode 100644 res/drawable-xhdpi/icon_format_more.png
create mode 100644 res/drawable-xhdpi/icon_format_quote.png
create mode 100644 res/drawable-xhdpi/icon_format_strikethrough.png
create mode 100644 res/drawable-xhdpi/icon_format_underline.png
diff --git a/res/drawable-hdpi/icon_format_bold.png b/res/drawable-hdpi/icon_format_bold.png
new file mode 100644
index 0000000000000000000000000000000000000000..361e7cf2565412e324e133254e03f6341f2ddef2
GIT binary patch
literal 1345
zcmbVMYfKzf6yC-Z2?g7wF(9^fI>cC_^W2@?ouSLRyTfB!7Rj;-X|!c_<}N#dd30vh
z9oE)jf2jBft(3;Jss1xQ&;Y4zP!dU+NF+73m|)s80slywD4HO)iB01jV6i5oKb&Ol
zYtHwbbH01d^tZM&mX%bMxLmHXSQDRs^IqpIE`lR>_nHBx$E^Aet4&K=Il%y~u%x8`
z5>tdOkN|?zd-yv55f7Pivcu|#H*=z<;DTd=+lmg+kSt{Dg4hi#Bn7%;HHiNH^*1OY
zOF^`qiIZ_X3Nmt2-T-a+mZX^P7Fh`m)ggOr4iYH95)fPIQBBScqAR={Tsy}EimaGe
z-9dCUsE&9m64eZVFgSyWB;`f?EKV_$H$Xju&?My{NDo1IFpB0#mZKPC?Lnb8LrQZA
zzG2N5+y&8$W$7G2nrlKq$p~A}2?{3(MRD?4u{Ny)_&1CVt<7Yw4u}LWwX7k+
z`$$(8z)-sfJ8}$RG~9EB3@=6K;WaU<0M&}|K@@($C0XK90a^-(ej4+!B!hW9X$nh`
zK*UHY#RPnem-5p70?$Tx-a|FiM*
z%h2~4*84y#7d3!jX+~1hdJ0w0n$axH%xF3ijUs#Ef+(xbzQ(zu)s%T)$S(t_!O#?B
zMPyFiAOObi0b&XSFbepb1x?=a$8ZS7w@Z{FJ6APeMh*l?@>5h
zaa)@Y_71wG%?*>aZHJ1P6ZV(qj}2})S^4wQ;`HdvukaEXa}`x~_HDX|eU=D<3@leW^LV
zm>->8cw_9`-v?&8qI2oG+xpI`z=iDY_Q_b&{Ed-tf9WpYQ=cEzuJ5xxJTq4N${(ku
znyZ<^<9F&VU-~wjx~aP_gNdO$bN;27xf7)mkAE<=_`?iN{8s}g$s_K&<()43*oD)s
SZ3{=7pIWTGh5sVbdHf$&+0Bvw
literal 0
HcmV?d00001
diff --git a/res/drawable-hdpi/icon_format_italic.png b/res/drawable-hdpi/icon_format_italic.png
new file mode 100644
index 0000000000000000000000000000000000000000..b6a5d3f808034472c6ff86585fa5805abd72adbf
GIT binary patch
literal 1285
zcmbVMTWs4@7*1IiO4ouiO&yd6jH5xv>e$DQ6Wc6IN!)f3ODS1k5g=B_K50zr%WOAs
z140!OP>`kxO@qC(+E#Th2s*Ysz`BVAX&^3Rf}*LNCO`s#HdW&yA&{tm<2ETns`h{-
zpL71>|NH*CU+L@ZX>D$A_W69RsqJD0?OVOK$&XfHao$4PT~1fd*=ZD&B|uc6P*sWCq&CuqC5<
z6oPdy%H7Qkd5Xvz;SozkMUjR?Lmt+k?xe&Rj=qExRT1(Wt#ERbCL%n=5@DtQh&%;l
zf&zJ#i?Cr3rlWP9)$k$%y1Nn_&qg9F09{N%j8G!Wa&(*vC*ujRj!o&dBk3}%+g6e7
z8kV~$R!CYdVsEwu!dZp+ZHr6ddL
zDh{ww2FiKJ5dcQK;Q1)Q(-KYakXLvX0w{w#Uc)Q@H+dv-iu5|=hR&&9p?36+D|3K^
zl}Um+8XpVINhjA%`g{!?DKVaPFE7krXx)o#xYg87k8YU@T)unPKAB)LHkvi&TrT
zTbl`#uFp2ioWD2_?5KYE&eJEp{rpJp^z6uQ^J5R*`^WIyJ->&e-yQk%=xf#XIR8Q6
zRNKNSDf!Kzbyr@TcysgUpHEfyZ5n?gHg&S`1Do-&b3>d
MUA^MliT)S<0qgCu4*&oF
literal 0
HcmV?d00001
diff --git a/res/drawable-hdpi/icon_format_link.png b/res/drawable-hdpi/icon_format_link.png
new file mode 100644
index 0000000000000000000000000000000000000000..6df66bb8c68a75a079a6c3f4ef5aece6ab1bff26
GIT binary patch
literal 1824
zcmbVNc~sMO90vjA5Ksgh9y5kbrZY{`Hl^*TP}-^$3yh+ID4M2$R@$bt!4_nS;5jc4
z$L2#B%8+T1i74tALOl?0BC^M(@D%TRqEnor@|G&Ns*(gTlBxZ=
z=$#N$Q|txmViv@dJ3~ZdQ;#4gM={QMvZ~ekb1z*
zh$+c5N(j=HzHvckkjvi^>rMTEqC*B-FawM*n6OS~_v^K^iHafqHshVrrr2}?0ml#~
zGR=t7`A7;J0MoI1zaqOJZH*wxsG*aBX(c3{rX%!}Odu8UV2v_(YE38ohl#(Vn9>
zE=vfbW-+0fY9w{Q>mUm>?=S!jW)rxQ;6Vt%wL8xbhWIRu1@Q^KijNWqfg?(=AFukq
z!Gmd|V0)$fqjCn0=yJ3#-}V8$dD}^Zo^Br_-6!Yf?2e+_Pb`y&Vl5r_x60JMBHvX(
zsUqoy6S|?d$NPX&;Rn~&0PeQ+4KCg{uVyDcDVBt|?!0|2=kU&K;K7S<$>!AYiyAN6
zT&{{vT71m&vcDNKkJTql6hA62a=TMh#K?5%+EHVzxpi+(MW1ySusw2GUs()r44nM$
zu}yKs5>m9T>lcsMET2}dxwavSld+T9OGf*yx^CO#{GvXnbkx3V%K
zsNQcvr)V$FuiWXhXyW0MEf*tm3ejUD>iH8oD}>IqnNAV51YMW9CvTtZ8S{e^Dr>#)
z>)yN1+^T;#=6~hF!U9qC#M9~I`KQAYR(v{N6|vhdD!X#k5bwrwdZtGc%bzjfRn3OcuG623#pZYoI56&5!&
zoKHI&4Y;*m7p+{Klyg7xZo>^u*pVjxy!$g3UsP}muiWwsxF4(#GD2
z<>9XgF}I>kHM**CLVWP-lIOESiB}n`@m2Ag0+%evhp_#N`j+IjSWBbMdNiLg*QXw8
z-*n&YA{R%P5a!=0POo4Ok1LdNWzRFzxlN}cc4M6fIZS>j
znxl1sx_I7`a<7&~SbKJ@)jr5r-+p8|6teQiK2-i|K=IM6Zmz2}t94rEQqQGTf<3eT
z+^79nEd8PtJ6a|^*bMvkvY}evylsq5x2GLo`P}ZU)$_HMvYt!Pq^nl!Ep_skMSu8(SqdR(z-p(n1T`R38+v2n}nDO`({8cQ)DBhtLNH
zX6`-bp6@$9_ndj7yK7fn?ZdS`pRX>_A*b-#?7drS@K;)%bMVrD;yq}u)razm1AVQU
zm4QUUQ2JpCD%#MYix4BKT|M1{dXmpcs%6lMXG0eZ8>2BG_UmSp{B!zi
zlF+p%`2wG0lXeUa=p97|?k#qu)nZl^HL~RyqPZYp0s|t2C>VpLD;1(-nODMlPtA}-
z*#u>yEy5A|fIUcn}i6(*(zYAj1Y35TpPnv7!WcV(lTZH%IG}
zQgZv6FDymL0fcOcVeMrn^=sTr#Gh*bJaq#xT6R%GNGQ!T-Y8(ArH8*^o&=*UC96
zzK_1f3K-Y!-i|y&9F6q6qvK0a24zdl8PG%tIZEOaTGKTtBXF9aMmQ=gvOEYLM
zeGag&K1tBT1Y~?`g~PPLT*hLuFub{)QzzZOelaJy}9to>1z*an-6^BKQf-1
z-+Jw-U1P7+vn!*E2c2z4pI!WJ@-`X&G50~^zN&}V-t(hX)iw8*HzVU8o!q^c{oHtI
zdAM{3o!W%ezkGP*cy@aGk(t>~FEuP5F8%fG<+-s7OP3n<7r$t4Jhy#eFO;n
zzJ0d#_KaXWHb3%D;=Y6RR|9)WH|v{@M=sp*Q?sCCKXFw|PX#7wCRNG*(}_Jhw!Qnv
zVzEeGV>)6g?y}!FR>h^v0^2KvIw%o`y-JM)j
db$H3&>-#zQ*;{|FEOmPSr$oF<{|eK_zk~n)
literal 0
HcmV?d00001
diff --git a/res/drawable-hdpi/icon_format_more.png b/res/drawable-hdpi/icon_format_more.png
new file mode 100644
index 0000000000000000000000000000000000000000..4c5447aaa33686c1ad0fd65b60556c5b154f468d
GIT binary patch
literal 1130
zcmbVLO=#0#7%t2eoo+i#rd~qk!Qt}rrA^y})zLPaD=ypU3ahu~=W83b{Fr>T*+d1!
zg9n9y2X9jlgrUQOc#)wydJqLc=DhT#U|}Gl2SxqTwVQ{rgD>R!%lka<|IO*iv)x_C
zyF#H*cXnLL;e9yx4u(
z+Txrh=;X*5V%QfkfeDd9_~yLjiGGr7@{0HzJToNGR6%n|a@(nbJWXV57ZNYY5ejf3D~Nz6T0&xLu3i#z(pbwDz9q>DLXOBVwOWm?MQGbC
zGe8gohUFNJqp$|$Em%nLDa#vZGf2?WT*EMT8fb%Y?)EnnC}MBKDc8V7QRXFE
ztD4Y4St&{4KeTS>qMG3Jgcj$hn85N>G*SYT%0i7|fyyUhd=x~vc$;T0ycFSLF&?D(
zU-c2-O5U-yuaDl
z{CMakaisI@19bXRZT0DiZ#V9|_x|+ttoN@!TDd!TZsKThSL!q8mxrv!YhRx=)*g0s
z1oGxe?^d=i91j1^y<0i_y7Bq`QtyvhrC9bG^`+~UI${hH{hv{oV-kTV)Y%l
by>XyF^t0Y`b%R@;3Z_3hIw`HDi`V`Fy!dNC
literal 0
HcmV?d00001
diff --git a/res/drawable-hdpi/icon_format_quote.png b/res/drawable-hdpi/icon_format_quote.png
new file mode 100644
index 0000000000000000000000000000000000000000..c40e525e8188a8d4f7bc6904777160c9d4b66012
GIT binary patch
literal 1772
zcmbVNdr;GM94~e}L=i7yKn15bK)sD2(-U9lrU(qC+@UxX&d2b9a5~@OEmd&4&GV1te)+xf{d~UfOJU-o
z`99v$y%`LKk1}4aqSr{*>*Ybu$cu|MdI_KuYAT7)Q+ACFXT<0TEe(iP
zh8v9Wt8IAF>P5-e>P$?m1EZsWNC!d_m~cu1I80e)5^+etSG)+lcU?mu@JfWrlz^{|
zQlp80jIiMVpUr1s95@^hirFw94i~{;0G9*vAPx_Lc`TTVaKs4A2Sy%{)@IY`5tTe{
zL>GOMfCh@PAP{7?+u3#=o3Ld-uvjdHI9!O!WziBWGRI7594s?AYm`BblbFqDp^StX
za4~AML^dS>X-i+bV6vd-8)7p#5-2)kkV9jEU^WLbnOuIok|rq?{+XHChFU27)3;17QJVGGH#M!Hj0tImDHt
z*DlL(n{gGci?b0X;8l;byvhY;>PYpHO&}Za-h8JSN%Eb9eiSjp$|j|tvM$6gtgZRK
z!=t$-dBMZZg35rso-<=pF|om|qE~*el|oG0_Bt3ZPg#3KYQ>I@{9x%%p}|t7$SZE$
zj$T2(H))lDrTaV*QtJ;5HX3h+FjGz}E}07ZHLTTGC+%krbh#g~GTIW`c<#S@w%%_j
z419hKXbLJX9Y4vMA_%>%%%6}LBGw1_l;w}@UUM@1=6%J?3yj9OMZ_hq>qzFO-do4I<=j5u+c|E=+PsFE@7a;_
zD)Ykp7kt#Mvdl<*PvN|_Y0Ukis-P0Jk6vX3=QSD|3vzvaUFOpm*NL~@@(pVY$y$DJ
zurgwhEkU)2+MM)cdmphRvAgYOa;Tfr?OoRFD;r(0nRvLPw&`>^o^r&6j(=XxzFz)@!qfd8%%sXUVv%s_Z1e
z(zJDldi~q4Jaty4GRfHeeqSB^WK!9toXTy#)b&@}D_#mckPmL(aBuLLT5vYk;@Olv
sQ}?X4Ag%fb&bS}{HHOlsyo8Q3sK{HLS6lAxas7XkibeAMvFZ7L0c`T2c>n+a
literal 0
HcmV?d00001
diff --git a/res/drawable-hdpi/icon_format_strikethrough.png b/res/drawable-hdpi/icon_format_strikethrough.png
new file mode 100644
index 0000000000000000000000000000000000000000..4edf8e0f3f41432ab3855ca3805c1fbca636bf11
GIT binary patch
literal 1615
zcmbVMdrT8|94~_C6ntQ|IULz}44E0%dz34^(}K`zp_8I1b<|89*Xys+mFv~(0R@$T
zvMJR_%ocQ;7#*3wqHfN2G_pa&vEU2m3x><)2m_q2q&gjwU6DGo82{KMcfarN_xpZ6
z-}hB7%*l+N5IaGkP(&NE7_+?24ZhkPR$%y0!4FW6dz+v}@r!
z(uA2jI#A%uDic9&S&oG(b8(a%PD_R6`e>Pe2NDbU_(Hdr_G#e}URsue$0!Vqs7Nj?
z{Mae0X(6N&L;#UW65%jB8A_p)IEg1~@Fa-9a21NFP+W!J1dUNNPC}y(EL#)p4%*BZ
zMs3MEEnFZ;9vVeUN=lR^Dy1MUM{$axP>etc0+BTkZ>d{ieTdr|A7WsDmlK^H$tk#@
zAR}uNiX<&8d-^y8-eWR7A$EI56D6k%^|2llS7Ip72jd#i_DW{(uN%+Q_F76k05t=z
zP$Y74Jsj~Nu$;T+8wx7Q-p~s~r(6`akP)~d9=IhVqlM)grQK<#Z5qO^;Zg`hO<^RG
zta9Lp4Fep4;WkpECX?}GA|=H0EIgwk2u6?TNwu29alI;oQDY2AYKU}AvMxP?31N+H
zuf)1J5VGx*ZI5D^=VED{2v|uFErL)O>Vky@f+Tng1P`RsL2sB?≷BX9sKaIAjKh
z&SGFUhyo9dB$;+T!vQiy1vnefAUIG5gQrpuieL$Z0+gL10S-9a29M(H|2KK4>=YX8
zl&3l;bR@T9P<%26^5)4T0k=FpqC6+Fc4)6F6k|jqlWy^K-T1VJUyDsSHFIE$6j2iK
zu=cVPF}-rrJVTbDVrt9yUQz&6_OXU6zP~Xiv3p;o#sBcIeQN5^o&Ccn=IA=R|EL{m
zIADCVcnnq%7L~6EpZ={P@+tB5g@!HE2Zy@(J(I^3_Xk#`*4#Le^y|u8-^J2%M=u|Z
zE+}vCre~hqTVq+*9(U_(tZGRQRb%ukV(XfV&b)f|lflHg=0+_znszaFx4O0Lo;aV|
zRmtVQxbo6>+v29tv5k`_cD%e&IdhS8V{SwF#ve2;uy5HKH*Y6t0`Rw4>LsQxs
zU%J2a?xcfLn`Z}BXJ4p$zYXP^mc6(BKt@mJc4Lzt)0p2LH@~j4?#GtYsM>G#c=GOC
zc-=NY8+Tn}PWj@S>N_ga5C2vkGeI+}bnxvr&_w=QapT`8w)COjWhstU;9vQZ5-oLpzLA5^65w>7^bek=0+lrqD
zC;o7?%XMX5AgtWig@BIV+l$}oGMdUCw6vT*A9MU;Z^F{W@SE=rMBH9hRoywzl{9n>
zzFG;z#%}GHR*~fYV#7Iq)}{CvTa#LRfry7UOJ6v*@2~nkkkNbvIekSntdH7RwR2GS
pli5G)4Es;{M?2xq_RbnbxT1exZ+1Yt%@X{@8}&KN-i-V;{{Xk{U0VPE
literal 0
HcmV?d00001
diff --git a/res/drawable-hdpi/icon_format_underline.png b/res/drawable-hdpi/icon_format_underline.png
new file mode 100644
index 0000000000000000000000000000000000000000..4849687a21e00f60416423212d1e7a32cc3c0fbb
GIT binary patch
literal 1268
zcmbVMU1%It6rNBiZPK7fC9O6(%vz`>^K)l+c4x+JvnCshH1l(ljGOs!
z=EmIwBQe@iZE4yH)>5ei(T6C(B4W`810pr`p+pgB5RATv)zT`8)d=-YvK#vl`ryFK
z{rkRizH{z5^HOKW?)ut$YYBp=&$cT$JnjtN4eRk&{^zofhpni!fV$j%RMLD%q)boG*CR6-a)+uJmJ_ZY3h!toWCi-xGtg}FU7K7^vTUs(
zKuAQPp+k`dFdhakC1{D)cv^yzDG3lj1L#zRZ~oupu~-xvR?01vQ{BSl7*1FF054WM
z2|BoaeB39`oxAoFLDV#4l~lgG@XNw{{RDT{`1g8Y_8#w!`TKHu=$
z#Yoe86Olg9@MgnCb+2&n=E*~kieFAPZI3-T_T8E7pIvNjCf2Rrw1w-N9j{rLG+2j^
zJW>2(I{m}xzhC_(rlt>84noA)#QDdU9+`YSeYFH$sGHn2)^+8z*^k~|+K8ARmAaW-
zo92!bFPxZq_UlhCkJa_eHxupKHk(%$vJXq&9zBzf-!~_md%pP7jo!vfZO8Y$`;OB%
z-8FS!&s)X)m$rWRO7O+;#>dnfTc$ra(JP*Md*Ju(vrCJ=)?NQu=|0`Ed&l*jo9W)-
u1N*yatmEj52kyK@R~W+LUl*PnuOYavxGR6o-~C4TAIi3NC^PB4iGKm#JEleB7$2R)4My7~v{@rBF%wMqS&3L3Wx)dz>Y;p|yawTzJL>x4>%jnM?r(OI%(bsTv>L8H2vp#J!F
zi2}NopoaJ?o3&G@p!ZEX=)!dWpgKLS3L4dU26U7}Y`{RC3`$1Pbj4DF+O;dz85pJ^C$fSFd9eRb*qfu}
z#hlc$?+Z%_s^EFH$S{+WlcC9Q$Z|#*Catz1OSc7(_OiwP+rrTDvAR$+EblcM{
z6ZjTo#hUOE6lS^?f?;Q~2Zl{|KT$YkOi8vG7-AX2@Z;LmcD)?>m&T#m?%hDg
z2}i~C$hTF&ICsx?g^fFR{!Z#sJ*F+`GX>m2i(NTfr=}0&a
zX@x~9%|eBbNBIbhaIvbL!|+lV#@T3uin0>V$GK!Yl1g?v1dt
z>?T>%4@qW#n5$_p(M8w+GW
z7VuWFN^c;2tiJYEeek{7Z4R7ic=?sD&KGM|
zek6ZiZtA+(urgMD6xh53dirbcdFN&e8)Wd8*)J_}8-nN&<;8`Mj|9V?3)9P$zfPa{
zJ1opsu9L0rK5D(P^me%tC+F^$*V^k=9``xSXl`qnhoZg_cu6=BV-%pFN&gKUsdOqv^r5#jd+~HoeV9zFQr6WA=x_&O`Fk
z_dhHbGvMpM=2(Ou4SdtGy4>~-F~>BludnK0zIkh=xoIao_Qg!|jpK6Tn-1~o*2dZb
m+1ncbZTWm)UbIW6gJ79RObgduN{QqCe=3vimlnH6X8r**+q0zr
literal 0
HcmV?d00001
diff --git a/res/drawable-mdpi/icon_format_italic.png b/res/drawable-mdpi/icon_format_italic.png
new file mode 100644
index 0000000000000000000000000000000000000000..bd521a128da21e225752862af618817b138d1115
GIT binary patch
literal 1261
zcmbVMUuYY39KW<-8Knzh4B2L?zuuHZ^m6yR%O$z9S=!{Q9XY{&+iRGq(Tlj=j+g9mrN
z-}m?Xe7^s`_iDK`x~*q-4?z&y3j3uBUSs~dbqoF;|NCPDFT1?qaqplt;WcCj5ks1#
zAW$&mNmN0yHhbhtG(ZsDu3jDY#*1U3Y8i3a$Hbe4joAb-kZszsI*mM_ph?}#kT*ZM
zKmuLMkcasqQ?&DFO5Z={po4Rzsya8V3L2T+2L_rVR$w4c22G=Gx?(d!uIUx=-an>E
zum&kfRxnh8zW1kr715gZ4vWYmPP{
zR-}=(Ei7foDbKS-nr<{2@dg*SoJkrAff0f}4Pp
z!XTAmpu(qidXG4CMRvz)4B)jM5Kp0Yg4ow96@&x2S|R&~>tAMJ`SFfg&WsS5JVtSkcO(wYs#PZ?q!#2TgH0lqsK-2a%&+Ro%!)}cSxx9
zADUlWcl<&M_TI?h-t%MIU%2>8_KI_EYvjB9)eEiWt(tq1j&S*_q1N5MYHkfIF1+=2
z_@{u9img5zv3AzOx4V?1vDHT+*$3<4-gk#@SH5bUeB)O1QrHV9`(mrxBR}lI7pD$g
zKd{`o^zF-CUq`>lz4!iW?|c-D9Ls(FJaI0x<7Qyx!|tC49|t!+Bfkk;>?@!Db#UYe
z5%^>8<(^EW7VR6@?Z-IUm;P<(Kqzd5x`I22M?au=>d9ko`aht;a7j9wtG)OSRB@dd
literal 0
HcmV?d00001
diff --git a/res/drawable-mdpi/icon_format_link.png b/res/drawable-mdpi/icon_format_link.png
new file mode 100644
index 0000000000000000000000000000000000000000..587a4cd05edddb0b1b657520d60dae3f97f5bfce
GIT binary patch
literal 1547
zcmbVMeM}Q)7_T2VLgy!JVb0M@QNfS<>h;>*Nil6trD~yKRffoVy}qRtdRMN86kHZ9
zf*Nsgi_C2y4&2OC7NSwnMv-+>r;C}H;xd#)RHis(qstP^mg%lY-TpBCu}kjW_j%vv
z_dLJn>$cnTmrP8Vo}y4FCR+2DLV3-OzsVEiZ{y>WetCIKT2v&h6g*NjD*}bdEw}(=
z^|NK55U}o=%8MXJp%@qRIf|qr+j5!{{0JM@K|=n3j8-Ue7KQ>WR}Lh|1hS&g#BN*!U$Kx8&4oZdKUmDNV
z4mxTA04)STp-SZBdU!GuU^#a$b`)2X+0X@|Pc8~u!3bQHAMlcuF{U1QIFCxs04r55tpfMS=
z7L%DtV6A*mVtEcEeEVeIqgd>PSlS{2RuV*qAXFr}!0r_!A?OtXki`OJ+gQ%W$K^Tk
z8a)k}0itgMa4!}GKQxkL+V>m+q@Dnr3m9M==;FasdYIC%8khoD+
z@=%!+8t;_ucNNdQN
z?s#b4mezW%Sh{s3Y|rjVztLWC&E}YLXY!Q&Ov<_a1I1D2oMWwg_w8>AD_c)(f~O^!
zlKicXv&s89x_7E#okJ;G+3v>g8pFe1Sv-8ht&5T2=HQ)WpI<${E+ZE{kaWD|)$Z^b
z<%GIud6#PU=A0qrjBnA@?Pr_N3*v*Vb=A()FY3Ty<(cr-4W<1JEvm+F?oi&Pw(O3u
zs%4;K{Lv`p?fW}pV9XoNy}^R$k_BBqT#O}csp%Y3y7}g5)p(+B)`2qV#OX%owq@SH
z&H63P)3f@H{`l!DrD)}jU2PM_%wD=VboY;NdBF!KOD-I|qDlHa$_-`o+aHzi-#{@3Y>Sp=f04;X55IOB>$YH8$9y-2HJs9UY(k64|_VoS*j`nLDd;%G91i?en6?
ztjOZXiRQIn_vGF~b?+dTBfSNlwpIO?L~HJ;!PQx@BdhA`OPY3Vg!=z9=|hvw)E!uV
zzjsnc=KJ^UWP49qq(m7>Pu(~5?UTN{J=>iN77q7Je7tFzl4?q;%5TEDcHY|?t6eT7
zH+9tDUM?8LdO<7lI)@A;q
zcTKv#6gRrFGR&F#Vr}&B^@BejpO=0wW*v-}H%y{df0#4p>nNMGJqv9f`@CxhMLV!LvEbmQF6>@O9@{x&ai?wT(Cd$umhXWGrq@IS4G
BJq!Q<
literal 0
HcmV?d00001
diff --git a/res/drawable-mdpi/icon_format_media.png b/res/drawable-mdpi/icon_format_media.png
new file mode 100644
index 0000000000000000000000000000000000000000..8e1c9716f95898e36670b12f51e38bcfa7b994a5
GIT binary patch
literal 1215
zcmbVMU1%It6rNa3)51dWAz-a?J2B8u=jYDs%+8Ei^
zx#>>wV2c%Np`r+_6%iCvu%&sCN<>Q2uEYw`q6lIsSVTlL*atNf5$l~K8+{0UaA4-%
zbMN`i`Oe>*7#-f1*}ii-MNyf`kX|M0p7ibNB;S*NFL-2m2oKirSTK&8W`wAM6IcjT
zJaYn7k?G7%e~$VoYD?_a>bPzk(Colt%~Xd?ypW(Ns(&B}O?whyV4(@u&(pU*xkLlk
z$ww(8IWPlEnLBL+N#O^|p~eyk;VdeyE*_USQ4gH;tg
znWxuC)s0b53L*p~R$^=(WjZo6gghxpvXW$<5dkxVEv(qx5ydSs(N|d
z7m@OG1LIKRxMs7-HbpjwCOD|7D#r_)ATUIOiD!LmCX65Vv@Pf;wj(#hZs3E|qG<&)
zI8PI%Yaw`{VQd)oat|Y?90eX&O|s^0LO{xi
z$hMHeKqRNZt2ss$Oo366>ZlTe$c7fZj(7fV@;E|@OFQL1ozp%d?U-&i=70zrlZ1RS
zJ`tIdu4fJnks15Gq8Dn(jpZ|6X0Cu8FJ4|aI^Q}cF5I^lcklb@{H?u{O7W47S6S%gztQJ?6*Jv`sKl~-~U)TuvC6DAOE5H%7kZp51lr*oW>-zhlQy>V80-Ti(4$9l0~+-|Cs)n*LHMgTwlK
I@zC@C0EMNO_y7O^
literal 0
HcmV?d00001
diff --git a/res/drawable-mdpi/icon_format_more.png b/res/drawable-mdpi/icon_format_more.png
new file mode 100644
index 0000000000000000000000000000000000000000..b65dd92b07209acfbae09ae91972ac494645c34c
GIT binary patch
literal 1098
zcmbVLOGp%993N03G($a=5Da64LG$=#c4l`bH<{hhTyj*_CHLq&zIBIn9?g8Zvt9yE
z8PQot=vp1TNrs0WhoC5kju9b5fmCE&Iuy}2x@#T8LjyD4V}8H?`?owfezB{guY(|n
zuEMBR#Opxv9zBA;H-2xpcsYrN%V^54pt=!4LbZJpk_Fe8g+*xCjVsUKAVIW6PN|H_
z`j}$*E@LDZCUyhNCWyhII54alM5GC49WP6L-F!%qj-92ZMV-@wJghpSiy@p^94}dm
zHA}Xsp$p_-tY8B!Lm>r7o>{BV{9
zvMjS4&+k>kP*{f)Zen8!N>}o06D%#CKe6TpGR2=N4l4S8|eDJVJ~VH3YUzH
zjerFV$GUEk*Dg9jMff+21JO~b5kR&GBY!@$a6c;jEi$g%;f@j@jz*aX9o!USPV=pK
z7ka3mWhwlJu^n46GrXO#(mXB6oJgmH3ZP96S~LetF(Zj7kmA!VI|uPK0cf0*%ZrjE
z0x&G(G>OwhF~h5wR9?+#EpEY!kl|Ud<=er&o7~)?TqPeu1NmXe_vczuFj@7HA65N;
z%;(7g-LM=lIiF2>w3o65LuUcnBcbn-yG2%<0|F4!0<=t+p#hYVEgp-5Vv|YvXL4FscpQ`Mz7FtVUrErz@(Hm{cBI!gvBunjrk3J2pI6k5
zN93_~{o8co>bvzXou^Y-?R<3k#9MLcjDtS*y;Qr^_MTsxTQ3;&W8(JeHI5qDxpV3J
z%<9&5Pp#)c@A|7-&%42?v4yACe=cu)Sh@RTMGZRD_w`Q9)4Ct`-Y43KHU0SXy-)FW
OqVB@*xVDy?S^5K#nqYST
literal 0
HcmV?d00001
diff --git a/res/drawable-mdpi/icon_format_quote.png b/res/drawable-mdpi/icon_format_quote.png
new file mode 100644
index 0000000000000000000000000000000000000000..c7fea712618abf725a2859f8d3d4dc917edc24bd
GIT binary patch
literal 1497
zcmbVMeM}Q)7(e^~ET{qTV~XP}6Y1o7AMN$yMwP-9DX~~fr>HSXn(_nw^yDa&iJqeL#|19F%V0c7{{J^(vI
zOd0S1#$UbqBFKiI(NfS`BA2)pQY;_RGpde05)u?N1ZB^U2n<^RWY`DFf}BnJ=+s#)
z9Q50?OGy{z67oQKuwbnSiq{r-*|im{)vujD56+HIih&T288{NEL8`>%hVyt4z@(l;SPVD9W~&}2aiay#f(Z;apqK&04G2z9n3cjwc=*vO
z-b8;
z769r262C@dm3joyqhKX>uXdy=Dr~4lVo)gxQ%Upenh@Y*CvDRzH+p~2Px&l_-@=*+
z#AL-t#ApcMhz|oSg5f^WVj_*WkuXQ?ybMnpa2hk^T1bZI#h7Q$
zrK4CUC&>)Qf~fDH;#bH^r2Q2Q>4&(j*
zH+iT+3ROGhKb;djQrc17j?94~j7$>Xl<^UjIg#388X+j=sgt&QBRBi^xH9R*Dc_Z?
zcNw?Ms!y4bpi9s(o_UuhsB{xdtv#6urY*_e>l{gi#Z!*$-Pdqz+H?;wdoH;z^PLNI
z@17f6)O^0L>h@{#t)-Lx>^^e8IsEX{^OKKmN!-<@f;SfKtz336(X4Z88b=-Ic&^75
z%5J
ze~6FYl<%IfF&q2;%5%;$EWfSw;ykj&mBk?HW$|a
zbU&wH_L-^O#Jsc~a=&{{_z&pbUtK+0i?&|{-Z`JgnXX)@JJ{K0+W!39j-pYAe;v$f
z+=#zl!uso_X{og-
zHyW;8YufpQt(`R!U-J9qjO9O~Guc?jxWwM3qlI7H{nmJQBQg+^+FQ5o?Wa`<1mCy%`bE;CNjhvYNJZ@i5zr1?f6vrolC5NDOy<`54)%Rv~_NBJT
z1uNsi-5a=$rmH%*z?Fn_5J4kfq=SXDrGKZkK|FpoD85+L2?7w
z7T~)1|oVFEG3m&~Pz~CK3p$YzQhUi3B;m9w@LIczvP?Sr{5d
zV4q+@YA8Ey4_ZK-ue?bHdzvbpd{aG73rI;ZTohqc1p%ONa3tUtLrlbktmtLbee4)R
z;1!5cZ$eg`a@nh4izEY>(oiUm6FS&HYY2+a8Hs0M5+}46uEhu~N{|drGXw?4FGRH_
z3m(S7TI04<$%ND?N|3>@a5$_9Yc-PW#R!_FF`UFm5>*jss8Lk72r7nh6B<|$;$>e@
z@kt^a)5y7{2E~M^p00)v2-@vyip5YoQEJMt2p7Z%4UPo@vA9;yA;kgybz@z0$k`YK
zm;;2Q2ANmu;mJ*q)!aSUPzD6!i`#NLJ?9A+Jy!Cs=b=T1}W9_}%{ktn>?u^X}&+j`={cz%3bnJtoHXdUZKR`{Mpj`{%yxf3o}ODv!hYO~Z|rTO--r`NgODz8=Xk*~n4r2X~ovD@!o-F=oW+&;vA
qIbNHcKR#UiL?UnL!7HyMXF$7p+EY6Io~VfZ1#M-OY?t}av3~%^OY-9Y
literal 0
HcmV?d00001
diff --git a/res/drawable-mdpi/icon_format_underline.png b/res/drawable-mdpi/icon_format_underline.png
new file mode 100644
index 0000000000000000000000000000000000000000..ebf1cc13940c5d2a163ff2c56dc6e032acb7afb9
GIT binary patch
literal 1245
zcmbVMTWB0r7@ioDt*vQNieQSD$wV+>=W=Fuc4wy9Cc8UHv(Sy(?V{_Goy*zmkj$ks
zXS0)iiEFgf5=!t%L@HS74J=eq3w@~ADn@)zvxMM_rKB$vlwu!zD2->5-RMK;g99_?
z{O5e%fB)yr{N$0I-3N9P1ksb7Pzrb*3g2Db_`7)jvW1s^G*&{#oieJa9wbtRqd_uj
zsZ+23Rb%etG8`s|PTwq+P$_p*)*XvcLktsGE@l(N@JQgQ`ZPqO2B%CrN&R`{Dn*(`
zl6pzVaXB{wE9OMqgU9QWMZG?)O9nM^m>dpdtiXauB?D{5_T?Z+ZR(ZrK0IbAaub54
zlhl?|rCgrOI36SgMxb>L#K?ri00G2AaFFCV5M{Y23!*gOWloZTK(-zVTl0*vTu{ba
zwy>0>DhRnU%hqZ&rWR!!Z;AzyB(WUN@;r?Zv_EGfHK1*Ou&qIXzV4YWG98-?HL99Z
zMM(;Kx)p-u=5pJLZNHT$oH900T^2ALYgu7jn`j>u;JrozT
zlX31IY$ya`Z{!y|6Bk9DQ5?N$K^tY2B!zDn!!%?~StV5re%0=6Y>Zqx(Y<(n?-SJM4?c50RhM0+Z)4%JY9r|C+cU82KXj*<|DxyC!tFm^zKd>j
zk>}1{?|nV~_-x0W^3b9E*{9YopICYqYzuj@`
z2Sk1uxq0EI#lIqFo*w=7-B-nZr#If3eq_&MXFj=>Ke~VPV&}4Ts`qO5@0AbDW@9_T
ciGE@iM;Pa(4tcft`S6F69h+1xrcb=~4;rGOR{#J2
literal 0
HcmV?d00001
diff --git a/res/drawable-xhdpi/icon_format_bold.png b/res/drawable-xhdpi/icon_format_bold.png
new file mode 100644
index 0000000000000000000000000000000000000000..de8b7136d2f28dcd265ad9052e61e5db137b46ea
GIT binary patch
literal 1558
zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdl8)k|nMYCBgY=CFO}lsSJ)O`AMk?
zp1FzXsX?iUDV2pMQ*9U+n2R$*B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+*
zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn
zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxR5#hc&_u!9QqR!T
z(8R(}N5ROz&{*HVSl`fC*U-qyz|zXlQ~?TIxIyg#@@$ndN=gc>^!3Zj
z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5
zFD#PU%0_}#n6BP2AO_EVu8M)o`HUDF34YC)x{-2sR(CaRb3oXS&*t9
zlv2Y
zYV71So0y!L2jXjj;t1kpm(-%nveXo}qWoM1a3EV{VsU_}xp8W8
zQmTcnVX7I(^OokimPUz2x|XSyDVC^mWFj;!KIEGZ*dNb#scZj3R@p9KF*I>gv845})^H?-F
zws}_u{%<(#lT2quCczE|79kcTfkqA$4i^O`K@S0-
zfYJm7pn!`4=hD45HjufQ2AHBP_6HX`9|GqM=S3zZjI{I{@`@#TlYS_wxe4j
zHappOM&CJf@^@W$jre(i8#gTXcz7qx>pHPX!YLv7`6s*Yp%xR48~)v`dF)8;MOlk~
zju%v`LZk2%!;dJ}YR
zsx8Z|-Ry}@C
zf$6Vd==Gc(ao)uR=Zel){hVkaX3XIu7o2j&?0?F|?i10+*$#F{h?_ILexQ3%`=40o
zgP;YqUOBh4_4LwqXFKkBEY^3vZ$~X-6mYE7n=I`LflC@1YIw&TWwkIT=_ae1Dp
z`^TR9Y|OEzz7N>FIUA>U&)l}AW2cGT9^1#C&a5xsKia>=YJzHGT8^>xh4!TIJzM&N
zeP`C|CGlWHjUzCwIvkpSaV5~m(ilFco{5LyaJ7%}&pi*rK_#`PtDnm{r-UW|`{Xu-
literal 0
HcmV?d00001
diff --git a/res/drawable-xhdpi/icon_format_italic.png b/res/drawable-xhdpi/icon_format_italic.png
new file mode 100644
index 0000000000000000000000000000000000000000..0f264567113bcf4c86d045b2e604cdb33583d6f3
GIT binary patch
literal 1512
zcmbVMZBP_t9A8PD^OQI!G|6U`6_l*KeL42HT{(!mJ>tqkfMNiZ#ho
z#uT!-v$hn;jCf@^z+hN)b+x|QpckcbjG$>6!%2)JQ3ZhpYy2`7M*YFnQ4K5z@{$mc
z1Mf%+?W>~bk+m_
zRtSP(NaB@xl&y}EmE7IkkP1}1VKz#FQWUO|75R`4_+>k5MwBmlkKke4CemZ#Gf31(
z;}n{1C?ile4tNwN+?2^kr4#97MpVyyeAYl(tTq!%8I2S{*bEldh_e)BB6CdX)*K5P
z<=Xv0ne+1?YFkij&vLDIlMX@s41qEJF7K2_f09&nanuFs7zbZeh)@UYV
z7Dz%B@Z?IO51vjkBh2Ffm0H4H@KLo`rwX-?S@W|xuPqBqL4>XROx?XKc
ztGi#@kiYh|1Dldx_j+Y^^+DaAi!2DeDB(+co^#!n!LOSxI}@HtV^fl}qXQeZMJ8Jg
zHiyPeOr;ziYdtwR)<1CJ#K0JGa9e)P#F;iIqG92f1^=;rp8M;^8+FacU!f0`jPE;9
z^x4E0-%QA7kFO694Ot{pQrdXcrFm}E&0EVlhbHvhaZ|gFe6TmB+;ZUEt*t9c7p(~)
z*&jW!>W`#Ar+w||x328aUVm~dQne*C($M?R!Z)(suNkr@pBiXbI(6uo#B&{|lY1`h
zTi$DU@2}$6cg9oWz2#4Il#YLhYkE5KY8!g3L;AC}NcYju+oOFuA6tLgawmU$N#w@Q
z6Zehm+*ar6TN5bk$7(j~T<4~+rpDX4+_o3$+v~soN$O9H9Ak)fUt**x!Se0xYfmdS
z+X}La@4fi)kp-=b+kLT-s^ty0x(8OqTw1o|dhiF6UNbo;B#an!-tv-;mZ43@H9ZF8
z4CYL{Iuvt$aQyOC-BwLccgmTQ1Lx~0&5lh!W}?h*wpFDqZ{AFt8s5^nw|YCGBq%Fx
z^cUT&yx-TIs!Ry&8g3kp8@^He-EQrLi|C6F7LR^)R-1Y>d&QmR{di2gMykoRuNIFj&>06kWzbM8)^xnRj{qfm9|7`@pPo1wABL&w?Xi3=A8a1^|E|OO&QlYpU&C=16__dpv2S7C$0Bo5;ZP36s)*0x=p~g@Q7j
zvH(p-m73DxepCzq_C{@HHjyn)5~*<=TWQl_lR7AAjEjY$O2#3TdJfFya&$UdUJKer
zA|3rt7%$Z}W|rzvPC9DDOAKnNANebmz*Oyi-;qs`ibj-T&{9oNZj$2a5*>;WGO2_~
z-LN%UjYuWnX$0y>9uy(uB2YL#ABI$1R1I-q6(Wd0!r^dU%q7p{-@^6$CVTsfLo
z+fe7VOwZwwu(dk4x%^Xzgx-#2k*YU{(ztM7{k%C_7n*-$<*eOvUj
zdAMxN({D$FpN>f0+#_XH9q9hj7qr(@xYp4+7KL8G&vwFcys{v`(epGG1eMIp?W$5#
zxtLG%Z0KQF!>ntvPFpONhVP?A
z%KF%oyghk@t3$4tf4o*c
z>DynzwfFmz7N@S#{K=GMjgs}b8;indL0RkOHxAN%4b98->ptkeX|mDl@x-cU>QMal
zo*&ODtnLvc2#nZ2^l
zimn3MgWbfePyT#3zyr(5`X>D2@vOMXbJHC+?ztORIF8+Xbh=v6?9e?r&lq4-WXo>f
zntB*uUR_je+CXzJ7%s!i{NJ2^@ZqyAw}kfJVPzeVT3gowc|NDAOy4zm%YzRmG`oF2
zy3%_0NdX<|Dn8k}_FvaKSq4UvwjwgV^YcLWyf%AsRYURK<&AHTVb`RtpC2mj8XYQe
z5q~YDx9eWn_bB%69}fW+6gSKN(4FY{`VmWa(=q!7U0shPY-;7WT$bdESG%RYIqJe)mQtEf+DQbE2lV
zGW`;CgS1Z+og6u>8_V$aZtpc?vf-T$)4gG`tQxQFX;Y!m|M)fK3y@tj?UfO6ylU4l
z!gg}M>R=wP-OTde_;LBWrx+joGqA>fqG31Y`{ZQONyD-qj_>|y`G+kP357v^E!VY;
zMM{`xojjLx;QUpuzYR`XJ4VfydD}jmypTkjb!&E;JEWO^#fp4J=jEjKGQQ8=hnWWH
z{CbG__m=3lUIU$~Zi>L%ze_)$-gO
vDZTR#|A&qXyxc?MMN>i!#oOuFc?Vx0_h#UIy>3?N2R>PnNdDZmjw@;@u<8
literal 0
HcmV?d00001
diff --git a/res/drawable-xhdpi/icon_format_media.png b/res/drawable-xhdpi/icon_format_media.png
new file mode 100644
index 0000000000000000000000000000000000000000..1ebcfd3bf22e933f8eaa4765a9639b9f15e83a45
GIT binary patch
literal 1419
zcmbVMZA{!`9Phz7$@G?~jJ;r7Q=HC8uW#48YvsnvmBA^8>~_bCVn(lh4m!B@XbT)O
zo47<5aZv;Dikj?ywC`AI1K6~*@Ijk
zI)%WJ=s~JzKkkotL4#DfQw7_0mIsBMjRGSg`J3UqIBOV)0-cBB(I#1A;~r$*E^El<
zF^0hNDte;_Ss+#IuYkRZ3Sin!qXJGiU>9R2Xu{zpa$yoDC=91CfF9&NsJ^>Lj%>?Wu1?svX+ywzyVEA
zrI;=$GHhDp!%BuD!jLqUC0ofQI)tD10+aG}-OTUjR48|v~O%dgzc;@)*LpxT>AD^=!
z&G$vJvecE6ucyZ{FLu0O0awPqoj5=9XwlZrOAo%+J9?{oe3{o=k}RQYY{kLT$*V5gjmweihr2GE
zUDuH_`_t6>r@nfs<}u5fbBP|g?nJi+E&HN8@6NhC_k&8?O>(w&87XlM
zreEFtqcr~K1DDy!GqXD^%GB`htv&g3v4Nhg)4f;UArAXP-`9R!@aoOn(11GJQ!~B0
zE7)#ZkL*404KjFFckm;9e-AB+l;o?#-FB4+~l>xo;ickluHsKWpTCeHA@%
zLQEX&?Ctqwbz&@7HM(NouGUa!daC2^O)u_$W+LQzxbE6O;DrD1
zn|@0iJ$9UdKB=4yfQgCEo3p87opZDzpLA5Y=(?s=>mP5=?OPQZ{PfGtzNf{$L${Q>
wpUd$>)*JcT(=R-~RQjN_Qpj4tpS)uYba7BRedUd^4DDHRlpzd1*-n!&oTzwE@Zd!T9`ztN^ri^DZ0+V@>|h{yU%%h)|MC9+T+0rh
zYzrOSJM}rLrF2(6hr$#ebkhEO{
zL{?-p9)>|wVxb7bF?bvZJPdJsh=U;p3NkOrPz3ddCe~cNDCd;Hx-GJb)8iOBGRIXa
z6}A#$ZFh`=k|c4wzzG6F5R5lzVYSLwUS~r=L7wIs4mNBH_=;-5F5@^&JlzbzbTXMO
zVauy0ilmIIstyNPo-<89t_`$@b7=$bA$$8)TBZ-3|Fb;*EU9
zHOQr?6N;^sO=RJ;5~s-ts~fsphzWX3iwaCc;zcGLDnh2fBaPu@85ThZa6;Os;yT>z;#DOQ8KO)!Y)u
zQccY*T{ZIU=&$wQchhQ-{WCi^zZzVeX$pe=8nw3_^xt1we%kC$YQMgAOfO}xzxYyI
zels)A>?i!&GoR(7FYEY)^?SEwOtsb=An2x+fb(;8W#J)_*%sS6Ti;i1YNcfNz=O4C
R)+zrdkxmUOj|a|Q`3po`Zqon&
literal 0
HcmV?d00001
diff --git a/res/drawable-xhdpi/icon_format_quote.png b/res/drawable-xhdpi/icon_format_quote.png
new file mode 100644
index 0000000000000000000000000000000000000000..7c963357507a76e55b33a6b5e083c9bebca622cf
GIT binary patch
literal 2009
zcmbVNe_Rvi89zV>Qjx(xOT~H~b`UhVT#^e(YN|1Z61o7US*0aZlFK2PTrMPs30NEh
zadk4WxLOdz9~8A63L7nAsS?TxwI*0UaCuP!l>sZuTi+DFFCbjhYlXMfH0rPLW)l$A)Vs%?ug6v==Cz_aZ)L&WKcm_2oU9>9Gr&;!B`0wK@p)CSpxEThydmZU_`({_)?xk
zilE@s12NGoh7741TR9br(PU62O`D}KY_r+8HUXEitb-AWL;~~pFrUw1EI8I&6Ropz
zOxDP04;W#^Ek-kKq)ed4qfSrd&@zb0^l=HKS*3d7*kqk*6w@-;t~0|3mj{!ir>;qB
zE3GE}o5oYEt(sgj0jmism1Dt~`^bo#1~a{Tb|8--lZ`aVVq`8wmxWPy4oR43B_@NI
z6RyE%km|*JgBXwHb3_sz$`J}O5RRTl;2a*JN5vvkhzR+y(|(?Y#{~S9aSA~kDiWax
z5+_)JiFg=_iurP}P$6G|O=FcNE3Gr(#B^*U6MG7aJrgTcSO^_WSu_-tH9ZB%nG{V~
zGbuBuP=L`Y9d0yvbhhV?9+!*}7UKrOu+l=2;AE4f#-}8J#tH~rPl!1PA@US2iRDQ6
zIzC52NDLB`KnNVsLsNLe|Jyv6NecE%%KuEx^cFLY9`Oke8086*2opme3&WF+%e74m
z{T?VWxyIf*Sd|(dwmNjn^~_y<6&mc_1dMK7v1Un8;X9iTESB9>hxaSwJ&Kic7uNZ+
z1M?c{2H17+2P#)DoD-GDt^uK&`!|0usE-NGl|0aneTNNzK@dw*k}E{Dl#-S$Tem1#8=a+2Y#GFIAVRrqYH2KuNKvZb!tC$csYwNwO3^8
zceSU63|yJ>wy>*wU`%lXx##N`F_X?tc6E%qo7=Ixky{%4a>&tu5XUD&VXTLX+W!$T
z`qSri*;?0o5y##K=C-XNzi+9=Vs~X{%(09-U)@!5yD+E?ciovd;l1P`EkVe;0ubP
z)V7ko09*6G74PAyc_(^5&7Ils_nwPUW4lj}+lYN#JQR0fPKr7E^hyPt+DK;efJHw)>PiJ+pw!-<4|~glSM7yRfNZ$
z*ChSRbp{Mw!r$bPS`rc(=knDN7z(RmJwuArUVE(^|D=Ar<$lKf4C
z8?MA_3vb)T0>KZlh9ieWodfK>n%s$+1zxZF*Uocg|9JC$an~okrGRo?U8V~TP8+-m
zeHV59mA)N`<6-G(g;A>nb_zx`(pNvYtp3kAbZD>t^4e|pRz@edhmx}>
literal 0
HcmV?d00001
diff --git a/res/drawable-xhdpi/icon_format_strikethrough.png b/res/drawable-xhdpi/icon_format_strikethrough.png
new file mode 100644
index 0000000000000000000000000000000000000000..6bf5894c7c9bf7d01010687dbe23360c098327c3
GIT binary patch
literal 1897
zcmbVNc~BEq7+(+(4+IowLBu7Xq9xgEl7%D?6cR)jLorYR5$$HPK!jw&W-%KOEP{>~
zI9}CqC~9F^QCqYsEmkbv@hFZ}K@`#AQ4B*w6qJ#6qhOD5{G&T>_kHiZ-|xHL_sy=2
zjfr#|<2eQZ0LQ4gG6gfoT3-iy=3C;@bAXvVsE9-=j!2~pD2W4MDnf~aQ5rN2SKz41
zm~{aU0e}&Db$lX~D4!?B2n`3dVmP!$$FKn)WEQPMu?(C7m3W$3D`9olH?TmpO2SG&
zcx(p2)*H1HO0%_k-(d|hT#u1z
z9i=9;pj9KPB(f<9i}Cbr2pXMS{!X!0Ka?mYWe|<(Aeh62G#YDMZ_s*5f&cBsd(rxM
zqYj4@xSq%+G3Gu}eTT_R?mleD3S_(ye@d#EOF=Vb1eUGAwN#W$!eUN1Dz!?i6!KI;
zEQrSr6mb!@fS(Gpm0TQSb73VS3`7L5fEP5Z=Y4z`pBFBT5FtolAOgb?{BT(ySB4-$
zUYJlI4GWhIbEC9+3e{rxux&MCdx$IeAXh9Uag-v+c!J0ru7cQff+FSefU4oPUhH%S(&-{Sxh#K$ouE@Z=apfz|=5L?7Ud2A6bQi%{8
z#xYpQ8se+|Z}K3)q%7Hf`1Ug6-i=U%Q$odcQnQbyw+4!
zEo*ZdRXx{tLgB|N>Fj_a(3?I{VBj70txJzANSQhAS$~#`&F$)qanV>wheK>`b8-n-qaw~v3+e23
zK3$u?%JKu5xpLCtt@B<(%{BK`tltZ#hwLTtMx#BU*G|ULao;WS&8Yt7MFnXNXz@$B
zPy!yB4ll0rvT3HfrzM>d2VR`qHnwXLgSYK33@yoe`h~gP?aJgswXQy1XUl7<)+bf%
zHL2>OAGP@=%N_bWS9LGHx0m}%%|gqD&`p}82b-m9UUmu$8xA}(8M8;WJ-4Ih$P;K|
z$H`Lvva3%EghvM4xU@{$T(g+4f+l0JU_y7?J}lEWI~!(N~|&B?9147xwZ*Q3!8
zcB#tTq*=54=$BYojZ)U-kBWRv!KdmbBqtM~Up17G~YTeJK+5)zf6%%vZYcG-4BfYm(jWk93nX2hC6BD`%cuO25`(vGsZ?$Qk
zH@@OTteM-@_&A;ry-J^wl?(U7G=!T{4hPkLYmrf|`@0)tj
z<=b{45i{2*?_hbu`J2tHnrg@T+dF@1u7F>@=CwqT?tK3{1|!7le4K}0b=Le`wzZc?
zcG|ghi+65J@gDD9R!ds#A1-8m`PlId4xePYF8&DLWhwUbn1W~KZXZ=Uc68iM{y1ah
zwH-@WTZ%i21p4s9+1DR71-sOBJ?(;3{I3Ql_%+zvepF(t81Og4?c)Zuev{pUY})S4-`MStnS_OxX=3Yi;9Sm9Sr|`%l7Su)V{pb0AAfx@CezA_-2f@W-1uL;WPF@d48
z5T(M5%{k?97NAx^0w}GaagLokH?MobPa8*1AC=Qz$gEtzV-)Hg~wLT+f(BgWA
zr13OeDTRAUz~Ln2rHy(zjY`uR!g?0t+jQD&tDT`}y`H8hyDr7x)EjEOoLG1NGWF=Zu`%-Jk5^C15Z(nlF*dJrQ-|)+W#Hz~fp%=$GxGPt(Hhv~`;9bL=yrr#veEVQ0@44D8wmPbk
zSxfhaxBHro?B&}gPKTO*Z(V&aRlNSPzHKUH*pf87_E!t>!br!izl&endg{%t;&raF
z$%>*^Cwrz|S#>`aPuS_<`lf(~Bn<
eX4x}P7e^vgupf^*R6L{pO`pTSxZmd;S4lAOl1I
literal 0
HcmV?d00001
From 12c724c367cfa02ae74b1f8d3d1f908062d61bfa Mon Sep 17 00:00:00 2001
From: Dan Roundhill
Date: Fri, 6 Dec 2013 09:37:07 -0800
Subject: [PATCH 37/43] Use holo light dialog theme for devices > v11.
---
res/values-v11/styles.xml | 2 ++
1 file changed, 2 insertions(+)
diff --git a/res/values-v11/styles.xml b/res/values-v11/styles.xml
index d3e4888d8298..a56b336a1fd8 100644
--- a/res/values-v11/styles.xml
+++ b/res/values-v11/styles.xml
@@ -24,6 +24,8 @@
- @drawable/list_bg_selector
+
+