From da74bc73e2229b4822eb678ff68614b0678befe0 Mon Sep 17 00:00:00 2001 From: Tim Su Date: Mon, 30 Aug 2010 04:08:29 -0700 Subject: [PATCH] Added drop shadow to buttons, updates to widget to fix bugs with completing tasks scrolled further down --- astrid/AndroidManifest.xml | 46 ++++++++++ astrid/res/drawable/scroll_down_disabled.png | Bin 290 -> 640 bytes astrid/res/drawable/scroll_down_normal.png | Bin 285 -> 845 bytes astrid/res/drawable/scroll_down_pressed.png | Bin 417 -> 851 bytes astrid/res/drawable/scroll_up_disabled.png | Bin 276 -> 573 bytes astrid/res/drawable/scroll_up_normal.png | Bin 280 -> 692 bytes astrid/res/drawable/scroll_up_pressed.png | Bin 371 -> 791 bytes astrid/res/layout/widget_power_44.xml | 54 ++++++----- .../todoroo/astrid/widget/PowerWidget.java | 86 ++++++++++++------ 9 files changed, 132 insertions(+), 54 deletions(-) diff --git a/astrid/AndroidManifest.xml b/astrid/AndroidManifest.xml index a4d8f0dca..7c917cfd8 100644 --- a/astrid/AndroidManifest.xml +++ b/astrid/AndroidManifest.xml @@ -412,6 +412,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/astrid/res/drawable/scroll_down_disabled.png b/astrid/res/drawable/scroll_down_disabled.png index 92fe7303bb756d5649dd13460453497e61e4f8f9..932b0abfdf92fac804408a66ff03c59c1d408e54 100644 GIT binary patch delta 532 zcmV+v0_**v0)PdOHwpg${{a7>y{D6rKp+Sn3ji6H`MIT$XeWOG+et)0R9M69m&;1S zKoo|*jFEZ)ZwRgw_u|$U@Bze)zJLoCo~Ll-P8fX%eJXD#ig&cOS`#;CV2n{aX;Kh# zU>Imi{*Tjt&isM8>ZbG|E|3f_z$8F{1zjK&*QeU_Qh<(9u1Ob2<|P z4PY1;0tOY-ln8&6=z0TMzzfg@I$0nCG_17`{W6b;ECP3~b0*^@qaEpIO#`E<8<{*q zi^xKsy0fX)h@G~{9J|DsOhlF|hS^rFwrA?ZWSpM>ufP*!1Pb-#2d)%LZ3N8k!L6_J1Sl3@0MQ{Y(lE7fVKZfd?6 zSRJ6L?Ysm|dWBM$6W~bqOMQOR!Q@Tq>`aP*5nuwC0p_f=2Nl31?qL0Px%Lbd0@KZn z-V;T9d)>?b$!R)wkp{r|{q6u?A8&?jrE gJd+d0Lj7t+5$=y>C)y{*I)U8h>FVdQ&MBb@09~*?b^rhX diff --git a/astrid/res/drawable/scroll_down_normal.png b/astrid/res/drawable/scroll_down_normal.png index aa11ac834143e9697ac34636ee6c446fc9229714..baf4ccdde9b244fe0797676c20f5f4c400cf9089 100644 GIT binary patch delta 739 zcmV<90v!FF0?h`HHwpg${{a7>y{D6rKp+Sn3OWimEKD_#XeWOHs7XXYR9M69*IP>) zK@`C8|7K$=QYaP^Ok3I{2>mF2DKSPrgwK8KQ;-(K5M7@(=u1&^k!tP5M5DEA%*C2I zyVI9R*)B0|;uZ?cfgvP$nBUHsIdc|9F^W4TP<7|7A~qDtgV_VV zxG;@g7(bw)P<=4nH2vs>@e3LVC4`XKZ1&^Q(o%mnO>WF(Kg=K?Unn7jTwh=RkWQyJ zwzjt1d*CTyePX=D%Bf} z#&M_9IbU90-ZTtjUlqMm&(XdUGi+D*`_5B0^dsQ0`W#aex74b%{G=&}Hr0)KpkNQx zirYh~@?LlEC%>5c_Ra2w&fQshJ3-%=AR2ki(6r=c;;uo%p V29&KjU?2bh002ovPDHLkV1iUBSLFZz delta 175 zcmV;g08szU2Au+sHwgd$0002_L%V;GKp+Sk2s#~rrR}bfXeWOFcu7P-R9M69*1HYB zAPhxOMuEw)Sh}zy1;tI1B1IJOv7vc)0PDz-C5NDtQcBGSTtLOY+zLv->4>V&{M550 zFH}Fq5jBo+K+R)}QQ7+PMp1T~F+llY22lQ(4%9kK18P0y2el9LfhyZEFH{5$AnG+y dN-4Ft8@_T-6AKTEm}>w4002ovPDHLkV1n96NBaN( diff --git a/astrid/res/drawable/scroll_down_pressed.png b/astrid/res/drawable/scroll_down_pressed.png index a3ade5a0b8eb51fe02f1af87fc29cb08ff743e7b..930e88b69d2cb3f74f659e72c731aea7fbc6f607 100644 GIT binary patch delta 745 zcmVy{D6rKp+Sn3jhT4|J8hvXeWOHu1Q2eR9M69*Go?m zQ53-O|J&adH`oe>{f7bY%Tx-)S_h%vPUsfh_yH%1UB zAkZhJr3A{$w#>|R;jJ0RQra>mCiWyZlbKn}FZbMg?ipxDJKFJ|h1TLbw?o$ZsAhYv zIquy?NE=21(sO?ZMgY2PxCygEOxv)WGgSSc4x9i^snG#=6w(cprG^1ifRY*qfLUvX z^u4FIo_D3Ax3T_s?`q_HgRgss!guUYQ3E7iE_oiWc?U-=O_+ZJVrs&g>bemb3T0ma z-6|sj(DWK9^NfC&FKgZ2)xIlzzMe|fFOZs>m?+mj-wl5yUyVd#E5IJG50n8@ud&Sq zpij=F$~)pr&fo9%dClBqH&6ybMvQB*d!hJvWIFK;C;(f)u3ArqUZ?hGUsiH^o3bn4 z?+-A$`A*XIxT&ddD8 zR#6cn7{7n{Bs!Ab*jWV9z$&l->{Qcr7zjHEux3+*;-=M^>-Pt|&7us143!3!huTod~^w0%ii%Tni`zA;YEM^22aq;?qLrE09#PvknxU7*r8Fs))6O za$u%`gblM@3)2XwB~%?uHBH}ZVHyQBg)$IwtQ>z_dNlScO?FJN9;O*kLns3w-&O_| z9)uGUALoBtGlj#}%yB?9QCn8$nm=&$oKJ3Cn6w6_hr@}nXe>RWAQ=bdpdO|bkP~Ij zrV3lz+UZoeCy;;kKJ_j#6_2T+mvwCIBQdRZg}=@`)t+<%XKjb%fjSC`>Uw0F+-Otn zs18X5JE>;eRF$_>J)auI9Jg<_H+1&S(%A_%jB%rp*Bo7feVx%P#?3zqt=^wRJKE8X be<^+dWzVN?t7L()00000NkvXXu0mjfv%6b_ delta 308 zcmV-40n7f=2B8CxHwgd$0002_L%V;GKp+Sk2s$X%7AcL9XeWOF{7FPXR9M69)}ac* zP!z`TZ=20323c@0YzCh|!8kB183d!xAfjWzhmdIy@dbo+1>e9b&SbKRWqPfKi(b#} zOy?gjgZ(%=V*@yj<2df84B4TWbyhg-yLdhdx!&Dvu8qN__kLtbFSHvIxUD5jE6oLB zS}AJn1?eX=ixhng3Zhj^nsL_5u`6Tbw@Xl#K5H0000y{D6rKp+Sn3jh_KPxX$GXeWOGm`OxIR9M69*K1C~ zKoG$3|11R+2q9|lk*LS=6r5&GpV z^>|T~%YZqX^#)Zv1a^UqG$<(o<43>W-v_RMd*BIp14h$If)t5a1SLgd(xRjcOd6Dw zg_##6Wn$(*xhZ>7v>oJ*v666L6}{(eGXWqjp)S>dma2bV6xsJ!o!SD{fR@ec;w$8U zhN@nd(Tu6;krmB0(C|Uxtx&DxCUMCwR}FBIa5J}U8MkdOTJ@JSV^bG3ZzJFp7yx&` z4e$uO1YV-Vk{|4R5G`j;EpLSSvU!Gf906gFkoakj$G~$8lNZQGeE{z^??e)QWn$Me zx~`HVCXO)*fr)+jNm5~qH|}{uX2HT~puGPg%?qodioY2@4}+(?E!bIj00000NkvXX Hu0mjfdd$=& delta 166 zcmV;X09pUN1e5}hHwgd$0002_L%V;GKp+Sc7Bd%Oz8P$hXeWOFZ%IT!R9M69){6~* zAPhxOuKRWx2G#}q6r^p8?+!ptpb%P9N-6b|dhh#+by$rtGfF{cJM#ub)G^JXh@6=j z6ww1biX!7SjiAW7+Flfy?~DgU7RHMr6XQXVjd?;*fw@Cbg}Fj)`ll$Rl=^rFQCl|1 UWbM@d00000Nks-uM6N<$g5cFd%m4rY diff --git a/astrid/res/drawable/scroll_up_normal.png b/astrid/res/drawable/scroll_up_normal.png index 8b4b67be1c9ce1721409b1bb2b0f137a63912eb2..faae6f8bbdbc92adb2bd4e86e34a213c944ef942 100644 GIT binary patch delta 585 zcmV-P0=E5_0<;B?Hwpg${{a7>y{D6rKp+Sn3OFUM%McjdI7x%5k#0v5TT{LgV04NqM*1H zce*e%i`XxM&hd0}22O`b%Q!O$lzHHQGM+O(&p7kGLYz2p;@oVE2-lG}0W!2ToYzvr zNWZXT2pCfv4oH7!!`E&l0%DTDMyu6&FdB`HYqi<|umfxX8|t{>=Sr9XF&WFU9_I7; zcez~dZ8n?DE|<%*UaxnlKD$ywMtKt?fHbhvXf&QpCX-J>2wO@ig%I{|I6SFTDldUY zz`okCw3=sJ8^(!k+oId;o|a0b*T7*^s6R0Edi}WX_-bf@^(|02aVc-~#vx zoB`*+cVLn9n79I#YSOt{;6hzvGeBeKRD7Y<{{?&leyH~=Kze}$;It1*H7TXt1wrbN zbbaZCI@hH-uQaacbrK$(pb=7~maa?ajFlJYsy->%h@iKUUj4Um4gW~|{J!GE`Tz18 X<0xtz-kY}%00000NkvXXu0mjf0+1DE delta 170 zcmV;b09F6A1(*VmHwgd$0002_L%V;GKp+Sc7BdZ>+~5|GXeWOFb4f%&R9M69(lHKz zAP_`Rjshq1Vs?5*3yN={g@rK+yFlXnX4{v^hM<&EO0^G&zy!n*FbSA}?YwCOOy($e zL)~ELhI+uXN4>zbLw&&bqY5y7s0z%rbtH_H2?qr diff --git a/astrid/res/drawable/scroll_up_pressed.png b/astrid/res/drawable/scroll_up_pressed.png index 3d60d158af128829918b28fc5096a9c8ef7e58fe..b63813fe4a2a02ab8e137ad23a77d1ba88696a1f 100644 GIT binary patch delta 685 zcmV;e0#g0+0+$AmHwpg${{a7>y{D6rKp+Sn3jh%AB>@4EXeWOHa!Eu%R9M69*G+2^ zK^O<{|L!Ccl5to<%fU&3Lg_94iotaNg$Ia)jKN-Tf180c1#DrFs zi}^yLdpA*Ey{RaQ(g_{aUVhv#__dTb&oU%p!jG0N%$71J$Mni&Lc75u#)f)4nTod% z(ce|;TLP$W6mfycFJz_LN~3a7W|Zt)z~pGRmQ1D9sV09rsI9H*n|vMhjUvNf9$r5` zdnG6Tfw4jclVVg$q|)l-cN*3{d}*{e#_R`0hQVCT$+w&^A}Y@6)9H*lF(`_R8q))1 z_CgUaFm6!9D~yOr(ArE+RpU=qt8Z+F<}MWR5+lYWt;dRUXVbkhMgDf^J-$)MFWR>D zupv%glZJn5YkQ!`u6{eejjb#f^QAP(N~3bgEyj+@sM%->k+1L9^(KHWZxjF{4%rDl zyR&$zFw-qh>6Ox`F!pomL^eBa1P@o=e%8JLXmgY)J4~5eh;QGU&|b`s8uNRdFe;xm zUd`P<7hM7n0ubc0BTF_60dN4oAppk!!~jGAj01m&@c)Rd4(cbEP?od-`~=VhpaakV zGywbn&<;3sqyRd+Q-crCa{`$Ftn#75J6S1};I7JK zwuf%>dl~$`Oxk1H%MO*GTZ|pWoDNB;&pKK1U~My}`dj)3ZzO}PFF*YF|Kb&lw?+XeWOF&PhZ;R9M69(ya=@ zP#DJX=ba0J)nsyD^%}JA1`LA1%WyCzcn?;yc~O{PUsw}SgDhEX+nGfyifrf0^8PR2 zJwF}}z;PVMag8D!N2)mN<8dFM)7_IFT~%&58ZaL6EI_(lBhP{=4!yrE^ujD~N@ftH z3#V0JFy5dyT#;oTU95sWFz?OPP^1;30Y%y|iYPLIQ9zL~j3ml6iU9yox;XCU5Jeln zRCysKjKor81=9dU)-W|uWEE2b_5HD1y2SY~F@ll!=p4s!9QUIq>X@&XHM9|@00000 LNkvXXu0mjf#SLzb diff --git a/astrid/res/layout/widget_power_44.xml b/astrid/res/layout/widget_power_44.xml index 8b321b787..aa4341a31 100644 --- a/astrid/res/layout/widget_power_44.xml +++ b/astrid/res/layout/widget_power_44.xml @@ -96,7 +96,8 @@ android:layout_height="38dp" android:orientation="horizontal"> + android:textSize="14sp" android:paddingLeft="5dip" /> @@ -126,7 +127,8 @@ android:layout_height="38dp" android:orientation="horizontal"> + android:textSize="14sp" android:paddingLeft="5dip" /> @@ -157,6 +159,7 @@ android:orientation="horizontal"> + android:textSize="14sp" android:paddingLeft="5dip" /> @@ -202,12 +205,12 @@ android:layout_height="wrap_content" android:layout_weight="100" android:layout_gravity="center_vertical" android:maxLines="2" - android:textSize="14sp" android:textStyle="bold" android:paddingLeft="5dip" /> + android:textSize="14sp" android:paddingLeft="5dip" /> @@ -232,12 +235,12 @@ android:layout_height="wrap_content" android:layout_weight="100" android:layout_gravity="center_vertical" android:maxLines="2" - android:textSize="14sp" android:textStyle="bold" android:paddingLeft="5dip" /> + android:textSize="14sp" android:paddingLeft="5dip" /> @@ -262,12 +265,12 @@ android:layout_height="wrap_content" android:layout_weight="100" android:layout_gravity="center_vertical" android:maxLines="2" - android:textSize="14sp" android:textStyle="bold" android:paddingLeft="5dip" /> + android:textSize="14sp" android:paddingLeft="5dip" /> @@ -292,12 +295,12 @@ android:layout_height="wrap_content" android:layout_weight="100" android:layout_gravity="center_vertical" android:maxLines="2" - android:textSize="14sp" android:textStyle="bold" android:paddingLeft="5dip" /> + android:textSize="14sp" android:paddingLeft="5dip" /> @@ -322,12 +325,12 @@ android:layout_height="wrap_content" android:layout_weight="100" android:layout_gravity="center_vertical" android:maxLines="2" - android:textSize="14sp" android:textStyle="bold" android:paddingLeft="5dip" /> + android:textSize="14sp" android:paddingLeft="5dip" /> @@ -352,12 +355,12 @@ android:layout_height="wrap_content" android:layout_weight="100" android:layout_gravity="center_vertical" android:maxLines="2" - android:textSize="14sp" android:textStyle="bold" android:paddingLeft="5dip" /> + android:textSize="14sp" android:paddingLeft="5dip" /> @@ -382,12 +385,12 @@ android:layout_height="wrap_content" android:layout_weight="100" android:layout_gravity="center_vertical" android:maxLines="2" - android:textSize="14sp" android:textStyle="bold" android:paddingLeft="5dip" /> + android:textSize="14sp" android:paddingLeft="5dip" /> @@ -406,7 +409,7 @@ @@ -422,12 +425,15 @@ android:src="@drawable/button_plus" android:layout_width="17dp" android:layout_height="17dp" + android:layout_weight="70" android:layout_marginTop="8dp" android:layout_marginRight="9dp" + android:gravity="right" /> 0) { + Task task = taskDao.fetch(taskId, Task.ID, Task.COMPLETION_DATE); + if (task != null) { + task.setValue(Task.COMPLETION_DATE, + task.isCompleted() ? 0 : DateUtilities.now()); + taskDao.saveExisting(task); + + int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, + AppWidgetManager.INVALID_APPWIDGET_ID); + Preferences.setLong(PREF_LAST_COMPLETED_ID + + appWidgetId, taskId); + Preferences.setInt(PREF_LAST_COMPLETED_POS + + appWidgetId, intent.getIntExtra(COMPLETED_TASK_POSITION, -1)); + Preferences.setLong(PREF_LAST_COMPLETED_DATE + + appWidgetId, DateUtilities.now()); + System.err.println("completed business. posn " + + intent.getIntExtra(COMPLETED_TASK_POSITION, 0) + + " app id: " + appWidgetId); + } + } + } + + if (intent != null && (ACTION_SCROLL_UP.equals(intent.getAction()) || ACTION_SCROLL_DOWN.equals(intent.getAction()) || - ACTION_MARK_COMPLETE.equals(intent.getAction())){ + ACTION_MARK_COMPLETE.equals(intent.getAction()))) { Intent updateIntent = new Intent(context, UpdateService.class); updateIntent.setAction(intent.getAction()); updateIntent.putExtras(intent.getExtras()); @@ -159,6 +188,8 @@ public class PowerWidget extends AppWidgetProvider { public static class UpdateService extends Service { + private static final int SCROLL_OFFSET_UNSET = -1; + private static final Property[] properties = new Property[] { Task.ID, Task.TITLE, Task.DUE_DATE, Task.IMPORTANCE, Task.COMPLETION_DATE }; @@ -177,30 +208,7 @@ public class PowerWidget extends AppWidgetProvider { ContextManager.setContext(this); AppWidgetManager manager = AppWidgetManager.getInstance(this); - if (intent != null && ACTION_MARK_COMPLETE.equals(intent.getAction())) { - long taskId = intent.getLongExtra(COMPLETED_TASK_ID, -1); - if (taskId > 0) { - Task task = taskService.fetchById(taskId, Task.ID, Task.COMPLETION_DATE); - if (task != null) { - taskService.setComplete(task, !task.isCompleted()); - - int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, - AppWidgetManager.INVALID_APPWIDGET_ID); - Preferences.setLong(PREF_LAST_COMPLETED_ID + - appWidgetId, taskId); - Preferences.setInt(PREF_LAST_COMPLETED_POS + - appWidgetId, intent.getIntExtra(COMPLETED_TASK_POSITION, -1)); - Preferences.setLong(PREF_LAST_COMPLETED_DATE + - appWidgetId, DateUtilities.now()); - System.err.println("completed business. posn " + - intent.getIntExtra(COMPLETED_TASK_POSITION, 0) + - " app id: " + appWidgetId); - } - } - } - - - int scrollOffset = 0; + int scrollOffset = SCROLL_OFFSET_UNSET; int[] appWidgetIds = null; int appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; @@ -279,6 +287,10 @@ public class PowerWidget extends AppWidgetProvider { } else { views.setViewVisibility(R.id.speech_bubble, View.GONE); views.setViewVisibility(R.id.icon, View.GONE); + views.setViewVisibility(R.id.scroll_down, View.GONE); + views.setViewVisibility(R.id.scroll_down_alt, View.VISIBLE); + views.setViewVisibility(R.id.scroll_up, View.GONE); + views.setViewVisibility(R.id.scroll_up_alt, View.VISIBLE); } TodorooCursor cursor = null; @@ -323,7 +335,7 @@ public class PowerWidget extends AppWidgetProvider { scrollOffset = Math.max(0, scrollOffset); query = query.replaceAll("[lL][iI][mM][iI][tT] +[^ ]+", "") + " LIMIT " + - scrollOffset + "," + ROW_LIMIT; + scrollOffset + "," + (ROW_LIMIT + 1); // load last completed task Task lastCompleted = null; @@ -349,12 +361,20 @@ public class PowerWidget extends AppWidgetProvider { } else { cursor.moveToNext(); task.readFromCursor(cursor); + if(lastCompleted != null && task.getId() == lastCompleted.getId()) { + // oops, get the next one + cursor.moveToNext(); + if(cursor.isAfterLast()) + continue; + task.readFromCursor(cursor); + } } long taskId = task.getValue(Task.ID); // importance - views.setImageViewResource(TASK_IMPORTANCE[position], TASK_IMPORTANCE[task.getValue(Task.IMPORTANCE)]); + views.setImageViewResource(TASK_IMPORTANCE[position], + TASK_IMPORTANCE[task.getValue(Task.IMPORTANCE)]); // check box Intent markCompleteIntent = new Intent(context, PowerWidget.class); @@ -370,10 +390,10 @@ public class PowerWidget extends AppWidgetProvider { if(task.isCompleted()) { views.setImageViewResource(TASK_CHECKBOX[position], R.drawable.btn_check_buttonless_on); - views.setInt(TASK_TITLE[position], "setPaintFlags", Paint.STRIKE_THRU_TEXT_FLAG); + views.setInt(TASK_TITLE[position], "setPaintFlags", Paint.STRIKE_THRU_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG); } else { views.setImageViewResource(TASK_CHECKBOX[position], R.drawable.btn_check_buttonless_off); - views.setInt(TASK_TITLE[position], "setPaintFlags", 0); + views.setInt(TASK_TITLE[position], "setPaintFlags", Paint.ANTI_ALIAS_FLAG); } // title @@ -427,12 +447,15 @@ public class PowerWidget extends AppWidgetProvider { if (scrollOffset-1 < 0){ scrollUpIntent.putExtra(EXTRA_SCROLL_OFFSET, scrollOffset); views.setImageViewResource(R.id.scroll_up, R.drawable.scroll_up_disabled); + views.setImageViewResource(R.id.scroll_up_alt, R.drawable.scroll_up_disabled); } else { scrollUpIntent.putExtra(EXTRA_SCROLL_OFFSET, scrollOffset-1); views.setImageViewResource(R.id.scroll_up, R.drawable.scroll_up); + views.setImageViewResource(R.id.scroll_up_alt, R.drawable.scroll_up); } PendingIntent pScrollUpIntent = PendingIntent.getBroadcast(context, 0, scrollUpIntent, PendingIntent.FLAG_UPDATE_CURRENT); views.setOnClickPendingIntent(R.id.scroll_up, pScrollUpIntent); + views.setOnClickPendingIntent(R.id.scroll_up_alt, pScrollUpIntent); // create intent to scroll down Intent scrollDownIntent = new Intent(context, PowerWidget.class); @@ -442,12 +465,15 @@ public class PowerWidget extends AppWidgetProvider { if (!canScrollDown){ scrollDownIntent.putExtra(EXTRA_SCROLL_OFFSET, scrollOffset); views.setImageViewResource(R.id.scroll_down, R.drawable.scroll_down_disabled); + views.setImageViewResource(R.id.scroll_down_alt, R.drawable.scroll_down_disabled); } else { scrollDownIntent.putExtra(EXTRA_SCROLL_OFFSET, scrollOffset+1); views.setImageViewResource(R.id.scroll_down, R.drawable.scroll_down); + views.setImageViewResource(R.id.scroll_down_alt, R.drawable.scroll_down); } PendingIntent pScrollDownIntent = PendingIntent.getBroadcast(context, 0, scrollDownIntent, PendingIntent.FLAG_UPDATE_CURRENT); views.setOnClickPendingIntent(R.id.scroll_down, pScrollDownIntent); + views.setOnClickPendingIntent(R.id.scroll_down_alt, pScrollDownIntent); } catch (Exception e) { // can happen if database is not ready Log.e("WIDGET-UPDATE", "Error updating widget", e);