Orgzly-android: Support for agenda view

Created on 27 Mar 2017  ·  36Comments  ·  Source: orgzly/orgzly-android

Is there any agenda view functionality in Orgzly equivalent to 'C-c a a' in Org-mode?
To get the agenda of the coming week with a daily view, it seems that creating a search with:
.i.done s.1w g.day
or
.i.done a.7d
might be different ways to provide an agenda view. However, agenda (a) and grouping (g) seems to be not implemented. Is there a plan to support agenda views? and is there anyone working on this? If not, is extending the search with (a) and (g) the way to go?

I would be interested in working on this!

feature

Most helpful comment

:clap: Just want to give @pxsalehi a round of applause for implementing this much needed feature, and @nevenz for providing guidance. This may allow me (and many others) to fully drop traditional calendar applications. Great work guys!

All 36 comments

Not supported yet.

I don't think (anymore) that it's a good idea to mix the two and abuse the search (as I was suggesting on that page) . A nice separate agenda view/calendar would probably be much better.

I have a question about how to implement the agenda feature since I have limited android development experience.

It seems like the main difference between an agenda view and an Orgzly query result is that the query result does not expand any existing repetitions/intervals. For example if in .i.done s.1w there is a task that is ++1d, it will only show up once. Therefore, it seems that the query result must be expanded. To do this, agenda view is essentionally another query fragment which always uses sort by schedule/deadline time. However, in LoadManager.onLoadFinished, I could iterate the cursor, use MergeCursor and MatrixCursor to create new rows for tasks with repetition/interval and use separator rows to mark each day.

Does anyone think this is a good approach to add the agenda? Or is it better to extend the models and be able to get back results grouped by day? Although as @nevenz mentioned, adding g or a to the queries is not desirable anymore. I do not know if there is another way to directly get back agenda-like query results.

I can't think of any other way. Though it would be interesting to see how others are solving the similar problem. Any open source apps with repeating times like this out there?

BTW, method that will be used for reminders could be reused here, I'm working on that these days.

I have a first version of an org-mode like agenda here: https://github.com/pxsalehi/orgzly-android

screenshot from 2017-06-14 18-07-51

However, I have the following three problems and I was wondering if anyone can help since I have very little Android background!

  1. Currently, after going back and forth between agenda and other fragments and doing some scrolling I get the following exception:

java.lang.IllegalArgumentException: Receiver not registered: android.widget.ViewFlipper$1@5392919

this can be reproduced by simply playing around with the agenda and then switching to another fragment.

  1. I need to remove the search option from the menu but using the following line of code, does not completely remove the item:

menu.removeItem(R.id.activity_action_search);

  1. Lastly, since I started by modifying a query fragment, there is a lot of duplicate code in agenda fragment. It didn't seem right to extend QueryFragment which means some of the handler codes need to be refactored into separate classes. Is this the case or extending an existing Fragment is also acceptable?

I'd appreciate any help/comment with any of these problems.

java.lang.IllegalArgumentException: Receiver not registered: android.widget.ViewFlipper$1@5392919

I managed to reproduce this when I tried it the first time, but since then I'm first getting:

06-16 17:45:50.611  2956  2956 E AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.MatrixCursor$RowBuilder android.database.MatrixCursor.newRow()' on a null object reference
06-16 17:45:50.611  2956  2956 E AndroidRuntime:        at com.orgzly.android.ui.fragments.AgendaFragment.onLoadFinished(AgendaFragment.java:459)
06-16 17:45:50.611  2956  2956 E AndroidRuntime:        at com.orgzly.android.ui.fragments.AgendaFragment.onLoadFinished(AgendaFragment.java:56)
06-16 17:45:50.611  2956  2956 E AndroidRuntime:        at android.support.v4.app.LoaderManagerImpl$LoaderInfo.callOnLoadFinished(LoaderManager.java:476)
06-16 17:45:50.611  2956  2956 E AndroidRuntime:        at android.support.v4.app.LoaderManagerImpl$LoaderInfo.onLoadComplete(LoaderManager.java:444)
06-16 17:45:50.611  2956  2956 E AndroidRuntime:        at android.support.v4.content.Loader.deliverResult(Loader.java:126)
06-16 17:45:50.611  2956  2956 E AndroidRuntime:        at android.support.v4.content.CursorLoader.deliverResult(CursorLoader.java:105)
06-16 17:45:50.611  2956  2956 E AndroidRuntime:        at android.support.v4.content.CursorLoader.deliverResult(CursorLoader.java:37)
06-16 17:45:50.611  2956  2956 E AndroidRuntime:        at android.support.v4.content.AsyncTaskLoader.dispatchOnLoadComplete(AsyncTaskLoader.java:255)
06-16 17:45:50.611  2956  2956 E AndroidRuntime:        at android.support.v4.content.AsyncTaskLoader$LoadTask.onPostExecute(AsyncTaskLoader.java:80)
06-16 17:45:50.611  2956  2956 E AndroidRuntime:        at android.support.v4.content.ModernAsyncTask.finish(ModernAsyncTask.java:485)
06-16 17:45:50.611  2956  2956 E AndroidRuntime:        at android.support.v4.content.ModernAsyncTask$InternalHandler.handleMessage(ModernAsyncTask.java:502)
06-16 17:45:50.611  2956  2956 E AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:102)
06-16 17:45:50.611  2956  2956 E AndroidRuntime:        at android.os.Looper.loop(Looper.java:154)
06-16 17:45:50.611  2956  2956 E AndroidRuntime:        at android.app.ActivityThread.main(ActivityThread.java:6119)
06-16 17:45:50.611  2956  2956 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
06-16 17:45:50.611  2956  2956 E AndroidRuntime:        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
06-16 17:45:50.611  2956  2956 E AndroidRuntime:        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
06-16 17:45:50.617  1615  2069 W ActivityManager:   Force finishing activity com.orgzly/.android.ui.MainActivity

when I switch between periods.

I need to remove the search option from the menu

I don't see the search option in agenda, it looks good to me?

Lastly, since I started by modifying a query fragment, there is a lot of duplicate code in agenda fragment. It didn't seem right to extend QueryFragment which means some of the handler codes need to be refactored into separate classes. Is this the case or extending an existing Fragment is also acceptable?

There's probably a lot of common code with BookFragment too. I think it's fine to have a common one for all those fragments that are showing notes.

I'll dig deeper into all this over the weekend. Thanks!

java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.MatrixCursor$RowBuilder android.database.MatrixCursor.newRow()' on a null object reference

I did not get such an exception! I think the reason for both might be how I handle the agenda list which needs to support two different views, header and note. It seems that the suggested way to do it is to keep track of positions which are header. I followed something similar from here:
http://android.amberfog.com/?p=296

However, the problem is that since the agenda list might change (e.g. an item might be marked as done or its date might change), relying on position does not work because a position which was header might now be a note!

As a workaround I use tags to be able to check the type of a list item. Probably, I need to double check my code. There is a good change I have made a rookie mistake!

I don't see the search option in agenda, it looks good to me?

I was thinking maybe it is possible to remove the query shown under the agenda title. Apparently it is not part of SearchView. Although it seems like a good idea to leave it, as it shows the query that was used to create the agenda.

Unfortunately, I will not be able to work on this for the next 10 days or so. After that, I can try to find the bug (if not solved by then), do the refactoring and add some espresso tests.

Cheers!

I was thinking maybe it is possible to remove the query shown under the agenda title

Ah, that's just subtitle. It's set with announceChanges from the fragment.

Unfortunately, I will not be able to work on this for the next 10 days or so.

That's cool, thanks for starting this. v1.5 is long overdue and already has bunch of new stuff, so this can fit nicely in v1.6 later.

I have revised the code and made changes. I do not get the exception anymore. @nevenz can you please check if you still get the exception?

Cool, I think that exception is gone, I'm not seeing it anymore.

But there's an issue when you scroll up and down (Month view to get enough dates for scrolling, using just Getting Started notebook) - views get messed up. Looks like due to views recycling.

Also, I get this when I click on a date:

AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'long java.lang.Long.longValue()' on a null object reference
AndroidRuntime:        at com.orgzly.android.ui.fragments.AgendaFragment.onListItemClick(AgendaFragment.java:331)
AndroidRuntime:        at android.support.v4.app.ListFragment$2.onItemClick(ListFragment.java:60)
AndroidRuntime:        at android.widget.AdapterView.performItemClick(AdapterView.java:310)
AndroidRuntime:        at android.widget.AbsListView.performItemClick(AbsListView.java:1155)
AndroidRuntime:        at com.orgzly.android.ui.views.GesturedListView.performItemClick(GesturedListView.java:119)
AndroidRuntime:        at android.widget.AbsListView$PerformClick.run(AbsListView.java:3120)
AndroidRuntime:        at android.widget.AbsListView$3.run(AbsListView.java:4035)
AndroidRuntime:        at android.os.Handler.handleCallback(Handler.java:751)
AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:95)
AndroidRuntime:        at android.os.Looper.loop(Looper.java:154)
AndroidRuntime:        at android.app.ActivityThread.main(ActivityThread.java:6077)
AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
AndroidRuntime:        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
AndroidRuntime:        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
ActivityManager:   Force finishing activity com.orgzly/.android.ui.MainActivity

One more issue:

  • Open app
  • Click on Agenda in the drawer
  • Select a different period
  • Press back
  • Keep pressing back (forever)

Thanks! I'll look into them.

I resolved the issues you mention and some other ones I found while testing. I have added tests as well. Let me know what you think!

Thanks. I'm getting now:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.MatrixCursor$RowBuilder android.database.MatrixCursor.newRow()' on a null object referen
       at com.orgzly.android.ui.fragments.AgendaFragment.onLoadFinished(AgendaFragment.java:475)
       at com.orgzly.android.ui.fragments.AgendaFragment.onLoadFinished(AgendaFragment.java:57)
       at android.support.v4.app.LoaderManagerImpl$LoaderInfo.callOnLoadFinished(LoaderManager.java:476)
       at android.support.v4.app.LoaderManagerImpl$LoaderInfo.onLoadComplete(LoaderManager.java:444)
       at android.support.v4.content.Loader.deliverResult(Loader.java:126)
       at android.support.v4.content.CursorLoader.deliverResult(CursorLoader.java:105)
       at android.support.v4.content.CursorLoader.deliverResult(CursorLoader.java:37)
       at android.support.v4.content.AsyncTaskLoader.dispatchOnLoadComplete(AsyncTaskLoader.java:255)
       at android.support.v4.content.AsyncTaskLoader$LoadTask.onPostExecute(AsyncTaskLoader.java:80)
       at android.support.v4.content.ModernAsyncTask.finish(ModernAsyncTask.java:485)
       at android.support.v4.content.ModernAsyncTask$InternalHandler.handleMessage(ModernAsyncTask.java:502)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:154)
       at android.app.ActivityThread.main(ActivityThread.java:6121)
       at java.lang.reflect.Method.invoke(Native Method)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)

for a note with <2017-07-17> and day agenda, today (07/14).

BTW, you should check OrgDateTimeUtils#getTimesInInterval, which does something like expandOrgRange and was added for reminders. We should merge the two or use one of them if possible.

Also, do we really need keeping separatorIDs around - can we just add is_separator column to all MatrixCursors and use that instead? Cursor seem available everywhere where separatorIDs is checked. Seems much cleaner I think?

Also a thought - do we perhaps want periods (Day, Week, Fortnight, Month) displayed in drawer, as subitems of Agenda? Or would that just take too much space there?

Thanks. I'm getting now:
java.lang.NullPointerException: ...

My bad! Default spinner value and default query where different!

BTW, you should check OrgDateTimeUtils#getTimesInInterval, which does something like expandOrgRange and was added for reminders. We should merge the two or use one of them if possible.

Done!

Also, do we really need keeping separatorIDs around - can we just add is_separator column to all MatrixCursors and use that instead? Cursor seem available everywhere where separatorIDs is checked. Seems much cleaner I think?

Done!

Also a thought - do we perhaps want periods (Day, Week, Fortnight, Month) displayed in drawer, as subitems of Agenda? Or would that just take too much space there?

I do agree that it will be more consistent with how queries are shown but I prefer the spinner for two reasons. First, the different agenda queries are not that different! Only the duration changes and choosing the Month query covers other lengths too! Second, as you said, using the spinner makes it easier to add more options without worrying about space.

BTW, the tests in com.orgzly.android.uiautomator.ListWidgetTest fail! I don't know why!

BTW, the tests in com.orgzly.android.uiautomator.ListWidgetTest fail! I don't know why!

These tests require a special setup as documented in the class:

/**
 * Tests the ListWIdget with the UI-Automator framework
 * tested on an Nexus 5 Emulator with Android 25
 * Must have an instance of the ListWidget on the Homescreen, when starting this test
 * Also the default version of Getting Started with Orgzly must be the only notebook
 *
 * see also https://developer.android.com/training/testing/ui-testing/uiautomator-testing.html
 */

There are also some hardcoded timeouts in the code (mainly the 1000 in return device.wait(Until.findObject(by), 1000); and return device.wait(Until.findObjects(by), 1000); and SystemClock.sleep(100);), maybe adjusting these can help.

Thanks! I didn't have the right API version. I think that was the reason!

These two tests also fail:
testClearDatabaseWithFragmentsInBackStack :

android.support.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with text: is "Note #2."
If the target view is not part of the view hierarchy, you may need to use Espresso.onData to load it from one of the following AdapterViews:android.widget.ListView{7a97dd1 VFED.VC.. ......ID 0,0-840,1389 #102000a android:id/list}
- com.orgzly.android.ui.views.GesturedListView{8267036 VFED.VCL. .F...... 0,0-1080,1536 #102000a android:id/list}

and testSelectingNoteThenOpeningAnotherBook :

android.support.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: 'not is displayed on the screen to the user' doesn't match the selected view.
Expected: not is displayed on the screen to the user
Got: "ActionMenuItemView{id=2131755362, res-name=book_cab_edit, desc=Edit, visibility=VISIBLE, width=144, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=true, is-enabled=true, is-focused=false, is-focusable=true, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=144.0, y=0.0, text=, input-type=0, ime-target=false, has-links=false}"

Anyone knows if that is also a setup problem? I use Nexus 5 and API 25.

These two tests also fail

They are trying to open a notebook from the drawer, by using its position in the list. Which changed after adding Agenda item to the drawer. Probably a matter of incrementing atPosition.

Probably a matter of incrementing atPosition.

for testSelectingNoteThenOpeningAnotherBook incrementing atPosition solved the problem. But for testClearDatabaseWithFragmentsInBackStack problem still exists! It seems to be from these lines:

132: onListItem(EspressoUtils.SETTINGS_CLEAR_DATABASE).perform(click());
133: onView(withText(R.string.ok)).perform(click());

If I debug and step over them, it works. Animation is off.

But for testClearDatabaseWithFragmentsInBackStack problem still exists!

Does it always happen when you start just that one test? You should probably post the entire log.

BTW, there's a flicker when a note is modified from the Agenda using the swipe menu, which doesn't happen when it's done from the notebook, or search results.

Why is that detach/attach being done in AgendaFragment? Is it only to close the swipe menu, or there was some other reason as well?

In any case, I don't think menu should be closed to be consistent with notebook and search results. We could consider adding an option later to close it on button press, and do that everywhere.

One more issue: long click on item in agenda, then click it again - it doesn't get unselected. Instead, count of selected items becomes 2.

Does it always happen when you start just that one test? You should probably post the entire log.

Yes, it happened also when I only run that one test. But now with the same device (Nexus 5) and Android version (25), the test passes on my laptop! But on the other machine it fails!!

Here is the log when the test fails:

Testing started at 13:09 ...

07/24 13:09:22: Launching testClearDatabaseW...()
$ adb push /home/pxsalehi/workspace/orgzly/orgzly-android/app/build/outputs/apk/app-fdroid-debug.apk /data/local/tmp/com.orgzly
$ adb shell pm install -r "/data/local/tmp/com.orgzly"
Success


$ adb push /home/pxsalehi/workspace/orgzly/orgzly-android/app/build/outputs/apk/app-fdroid-debug-androidTest.apk /data/local/tmp/com.orgzly.test
$ adb shell pm install -r "/data/local/tmp/com.orgzly.test"
Success


Running tests

$ adb shell am instrument -w -r   -e debug false -e class com.orgzly.android.espresso.MiscTest#testClearDatabaseWithFragmentsInBackStack com.orgzly.test/android.support.test.runner.AndroidJUnitRunner
Client not ready yet..
Started running tests

android.support.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with string from resource id: <2131230955>[ok] value: OK
If the target view is not part of the view hierarchy, you may need to use Espresso.onData to load it from one of the following AdapterViews:android.widget.ListView{86122da VFED.VC.. .F...... 0,0-1080,1536 #102000a android:id/list}
- android.widget.ListView{9f23726 VFED.VC.. ......ID 0,0-840,1389 #102000a android:id/list}

View Hierarchy:
+>DecorView{id=-1, visibility=VISIBLE, width=1080, height=1920, has-focus=true, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=3}
|
+->LinearLayout{id=-1, visibility=VISIBLE, width=1080, height=1776, has-focus=true, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=2}
|
+-->ViewStub{id=16909295, res-name=action_mode_bar_stub, visibility=GONE, width=0, height=0, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=true, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0}
|
+-->FrameLayout{id=-1, visibility=VISIBLE, width=1080, height=1704, has-focus=true, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=72.0, child-count=1}
|
+--->ActionBarOverlayLayout{id=2131755107, res-name=decor_content_parent, visibility=VISIBLE, width=1080, height=1704, has-focus=true, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=2}
|
+---->ContentFrameLayout{id=16908290, res-name=content, visibility=VISIBLE, width=1080, height=1536, has-focus=true, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=168.0, child-count=1}
|
+----->DrawerLayout{id=2131755127, res-name=drawer_layout, visibility=VISIBLE, width=1080, height=1536, has-focus=true, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=true, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=2}
|
+------>CoordinatorLayout{id=2131755128, res-name=main_content, visibility=VISIBLE, width=1080, height=1536, has-focus=true, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=2}
|
+------->FrameLayout{id=2131755129, res-name=single_pane_container, visibility=VISIBLE, width=1080, height=1536, has-focus=true, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=1}
|
+-------->LinearLayout{id=-1, visibility=VISIBLE, width=1080, height=1536, has-focus=true, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=3}
|
+--------->ListView{id=16908298, res-name=list, visibility=VISIBLE, width=1080, height=1536, has-focus=true, has-focusable=true, has-window-focus=true, is-clickable=true, is-enabled=true, is-focused=true, is-focusable=true, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=8}
|
+---------->LinearLayout{id=-1, visibility=VISIBLE, width=984, height=161, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=false, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=48.0, y=-92.0, child-count=3}
|
+----------->LinearLayout{id=16908350, res-name=icon_frame, visibility=GONE, width=0, height=0, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=false, is-focused=false, is-focusable=false, is-layout-requested=true, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=1}
|
+------------>PreferenceImageView{id=16908294, res-name=icon, visibility=GONE, width=0, height=0, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=false, is-focused=false, is-focusable=false, is-layout-requested=true, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0}
|
+----------->RelativeLayout{id=-1, visibility=VISIBLE, width=744, height=161, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=false, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=48.0, y=0.0, child-count=2}
|
+------------>AppCompatTextView{id=16908310, res-name=title, visibility=VISIBLE, width=152, height=65, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=false, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=48.0, text=Vibrate, input-type=0, ime-target=false, has-links=false}
|
+------------>AppCompatTextView{id=16908304, res-name=summary, visibility=GONE, width=744, height=106, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=false, is-focused=false, is-focusable=false, is-layout-requested=true, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=113.0, text=Separate header and content with an empty line, input-type=0, ime-target=false, has-links=false}
|
+----------->LinearLayout{id=16908312, res-name=widget_frame, visibility=VISIBLE, width=144, height=161, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=false, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=792.0, y=0.0, child-count=1}
|
+------------>AppCompatCheckBox{id=16908289, res-name=checkbox, visibility=VISIBLE, width=96, height=96, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=false, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=48.0, y=32.0, text=, input-type=0, ime-target=false, has-links=false, is-checked=false}
|
+---------->AppCompatTextView{id=16908310, res-name=title, visibility=VISIBLE, width=984, height=105, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=48.0, y=72.0, text=Sync, input-type=0, ime-target=false, has-links=false}
|
+---------->LinearLayout{id=-1, visibility=VISIBLE, width=984, height=218, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=48.0, y=180.0, child-count=3}
|
+----------->LinearLayout{id=16908350, res-name=icon_frame, visibility=GONE, width=0, height=0, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=true, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=1}
|
+------------>PreferenceImageView{id=16908294, res-name=icon, visibility=GONE, width=0, height=0, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=true, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0}
|
+----------->RelativeLayout{id=-1, visibility=VISIBLE, width=888, height=218, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=48.0, y=0.0, child-count=2}
|
+------------>AppCompatTextView{id=16908310, res-name=title, visibility=VISIBLE, width=266, height=65, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=48.0, text=Repositories, input-type=0, ime-target=false, has-links=false}
|
+------------>AppCompatTextView{id=16908304, res-name=summary, visibility=VISIBLE, width=374, height=57, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=113.0, text=None configured yet, input-type=0, ime-target=false, has-links=false}
|
+----------->LinearLayout{id=16908312, res-name=widget_frame, visibility=GONE, width=0, height=0, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=true, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=0}
|
+---------->LinearLayout{id=-1, visibility=VISIBLE, width=984, height=316, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=48.0, y=401.0, child-count=3}
|
+----------->LinearLayout{id=16908350, res-name=icon_frame, visibility=GONE, width=0, height=0, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=true, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=1}
|
+------------>PreferenceImageView{id=16908294, res-name=icon, visibility=GONE, width=0, height=0, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=true, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0}
|
+----------->RelativeLayout{id=-1, visibility=VISIBLE, width=744, height=316, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=48.0, y=0.0, child-count=2}
|
+------------>AppCompatTextView{id=16908310, res-name=title, visibility=VISIBLE, width=744, height=65, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=48.0, text=Start sync after new note is created, input-type=0, ime-target=false, has-links=false}
|
+------------>AppCompatTextView{id=16908304, res-name=summary, visibility=VISIBLE, width=744, height=155, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=113.0, text=Note that entire notebook will be exported and transferred over the network each time, input-type=0, ime-target=false, has-links=false}
|
+----------->LinearLayout{id=16908312, res-name=widget_frame, visibility=VISIBLE, width=144, height=316, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=792.0, y=0.0, child-count=1}
|
+------------>AppCompatCheckBox{id=16908289, res-name=checkbox, visibility=VISIBLE, width=96, height=96, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=48.0, y=110.0, text=, input-type=0, ime-target=false, has-links=false, is-checked=false}
|
+---------->AppCompatTextView{id=16908310, res-name=title, visibility=VISIBLE, width=984, height=105, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=48.0, y=720.0, text=App, input-type=0, ime-target=false, has-links=false}
|
+---------->LinearLayout{id=-1, visibility=VISIBLE, width=984, height=218, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=48.0, y=828.0, child-count=3}
|
+----------->LinearLayout{id=16908350, res-name=icon_frame, visibility=GONE, width=0, height=0, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=true, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=1}
|
+------------>PreferenceImageView{id=16908294, res-name=icon, visibility=GONE, width=0, height=0, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=true, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0}
|
+----------->RelativeLayout{id=-1, visibility=VISIBLE, width=888, height=218, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=48.0, y=0.0, child-count=2}
|
+------------>AppCompatTextView{id=16908310, res-name=title, visibility=VISIBLE, width=761, height=65, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=48.0, text=Import “Getting Started with Orgzly”, input-type=0, ime-target=false, has-links=false}
|
+------------>AppCompatTextView{id=16908304, res-name=summary, visibility=VISIBLE, width=758, height=57, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=113.0, text=Import the latest version of the notebook, input-type=0, ime-target=false, has-links=false}
|
+----------->LinearLayout{id=16908312, res-name=widget_frame, visibility=GONE, width=0, height=0, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=true, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=0}
|
+---------->LinearLayout{id=-1, visibility=VISIBLE, width=984, height=218, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=48.0, y=1049.0, child-count=3}
|
+----------->LinearLayout{id=16908350, res-name=icon_frame, visibility=GONE, width=0, height=0, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=true, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=1}
|
+------------>PreferenceImageView{id=16908294, res-name=icon, visibility=GONE, width=0, height=0, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=true, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0}
|
+----------->RelativeLayout{id=-1, visibility=VISIBLE, width=888, height=218, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=48.0, y=0.0, child-count=2}
|
+------------>AppCompatTextView{id=16908310, res-name=title, visibility=VISIBLE, width=320, height=65, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=48.0, text=Clear database, input-type=0, ime-target=false, has-links=false}
|
+------------>AppCompatTextView{id=16908304, res-name=summary, visibility=VISIBLE, width=380, height=57, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=113.0, text=Clear local database, input-type=0, ime-target=false, has-links=false}
|
+----------->LinearLayout{id=16908312, res-name=widget_frame, visibility=GONE, width=0, height=0, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=true, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=0}
|
+---------->LinearLayout{id=-1, visibility=VISIBLE, width=984, height=218, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=48.0, y=1270.0, child-count=3}
|
+----------->LinearLayout{id=16908350, res-name=icon_frame, visibility=GONE, width=0, height=0, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=true, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=1}
|
+------------>PreferenceImageView{id=16908294, res-name=icon, visibility=GONE, width=0, height=0, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=true, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0}
|
+----------->RelativeLayout{id=-1, visibility=VISIBLE, width=888, height=218, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=48.0, y=0.0, child-count=2}
|
+------------>AppCompatTextView{id=16908310, res-name=title, visibility=VISIBLE, width=242, height=65, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=48.0, text=What's new, input-type=0, ime-target=false, has-links=false}
|
+------------>AppCompatTextView{id=16908304, res-name=summary, visibility=VISIBLE, width=338, height=57, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=113.0, text=1.5-beta.2 (fdroid), input-type=0, ime-target=false, has-links=false}
|
+----------->LinearLayout{id=16908312, res-name=widget_frame, visibility=GONE, width=0, height=0, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=true, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=0}
|
+--------->AppCompatTextView{id=16908292, res-name=empty, visibility=GONE, width=0, height=0, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=true, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, text=, input-type=0, ime-target=false, has-links=false}
|
+--------->RelativeLayout{id=2131755344, res-name=button_bar, visibility=GONE, width=0, height=0, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=true, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=2}
|
+---------->AppCompatButton{id=2131755345, res-name=back_button, visibility=VISIBLE, width=0, height=0, has-focus=false, has-focusable=true, has-window-focus=true, is-clickable=true, is-enabled=true, is-focused=false, is-focusable=true, is-layout-requested=true, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, text=Back, input-type=0, ime-target=false, has-links=false}
|
+---------->LinearLayout{id=-1, visibility=VISIBLE, width=0, height=0, has-focus=false, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=true, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=2}
|
+----------->AppCompatButton{id=2131755346, res-name=skip_button, visibility=GONE, width=0, height=0, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=true, is-enabled=true, is-focused=false, is-focusable=true, is-layout-requested=true, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, text=Skip, input-type=0, ime-target=false, has-links=false}
|
+----------->AppCompatButton{id=2131755347, res-name=next_button, visibility=VISIBLE, width=0, height=0, has-focus=false, has-focusable=true, has-window-focus=true, is-clickable=true, is-enabled=true, is-focused=false, is-focusable=true, is-layout-requested=true, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, text=Next, input-type=0, ime-target=false, has-links=false}
|
+------->FloatingActionButton{id=2131755130, res-name=fab, visibility=GONE, width=168, height=168, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=true, is-enabled=true, is-focused=false, is-focusable=true, is-layout-requested=true, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=864.0, y=1320.0}
|
+------>LinearLayout{id=2131755179, res-name=drawer_container, visibility=INVISIBLE, width=840, height=1536, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=-840.0, y=0.0, child-count=2}
|
+------->FrameLayout{id=2131755180, res-name=drawer_list_container, visibility=VISIBLE, width=840, height=1389, has-focus=false, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=1}
|
+-------->LinearLayout{id=2131755197, res-name=fragment_left_drawer_container, visibility=VISIBLE, width=840, height=1389, has-focus=false, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=1}
|
+--------->ListView{id=16908298, res-name=list, desc=Left Drawer, visibility=VISIBLE, width=840, height=1389, has-focus=false, has-focusable=true, has-window-focus=true, is-clickable=true, is-enabled=true, is-focused=false, is-focusable=true, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=8}
|
+---------->LinearLayout{id=2131755259, res-name=item_drawer_container, visibility=VISIBLE, width=840, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=6}
|
+----------->AppCompatTextView{id=2131755260, res-name=item_drawer_active_flag, visibility=INVISIBLE, width=12, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, text=, input-type=0, ime-target=false, has-links=false}
|
+----------->View{id=-1, visibility=VISIBLE, width=24, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=12.0, y=0.0}
|
+----------->FrameLayout{id=-1, visibility=VISIBLE, width=72, height=72, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=36.0, y=36.0, child-count=1}
|
+------------>AppCompatImageView{id=2131755261, res-name=item_drawer_left_icon, desc=Drawer Item, visibility=VISIBLE, width=72, height=72, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0}
|
+----------->AppCompatTextView{id=2131755262, res-name=item_drawer_text, visibility=VISIBLE, width=648, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=108.0, y=0.0, text=Searches, input-type=0, ime-target=false, has-links=false}
|
+----------->AppCompatImageView{id=2131755263, res-name=item_drawer_right_icon, desc=Notebook modified, visibility=INVISIBLE, width=54, height=54, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=756.0, y=51.0}
|
+----------->View{id=-1, visibility=VISIBLE, width=30, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=810.0, y=0.0}
|
+---------->LinearLayout{id=2131755259, res-name=item_drawer_container, visibility=VISIBLE, width=840, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=147.0, child-count=6}
|
+----------->AppCompatTextView{id=2131755260, res-name=item_drawer_active_flag, visibility=INVISIBLE, width=12, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, text=, input-type=0, ime-target=false, has-links=false}
|
+----------->View{id=-1, visibility=VISIBLE, width=24, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=12.0, y=0.0}
|
+----------->FrameLayout{id=-1, visibility=VISIBLE, width=72, height=72, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=36.0, y=36.0, child-count=1}
|
+------------>AppCompatImageView{id=2131755261, res-name=item_drawer_left_icon, desc=Drawer Item, visibility=INVISIBLE, width=72, height=72, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0}
|
+----------->AppCompatTextView{id=2131755262, res-name=item_drawer_text, visibility=VISIBLE, width=648, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=108.0, y=0.0, text=Scheduled, input-type=0, ime-target=false, has-links=false}
|
+----------->AppCompatImageView{id=2131755263, res-name=item_drawer_right_icon, desc=Notebook modified, visibility=INVISIBLE, width=54, height=54, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=756.0, y=51.0}
|
+----------->View{id=-1, visibility=VISIBLE, width=30, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=810.0, y=0.0}
|
+---------->LinearLayout{id=2131755259, res-name=item_drawer_container, visibility=VISIBLE, width=840, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=294.0, child-count=6}
|
+----------->AppCompatTextView{id=2131755260, res-name=item_drawer_active_flag, visibility=INVISIBLE, width=12, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, text=, input-type=0, ime-target=false, has-links=false}
|
+----------->View{id=-1, visibility=VISIBLE, width=24, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=12.0, y=0.0}
|
+----------->FrameLayout{id=-1, visibility=VISIBLE, width=72, height=72, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=36.0, y=36.0, child-count=1}
|
+------------>AppCompatImageView{id=2131755261, res-name=item_drawer_left_icon, desc=Drawer Item, visibility=INVISIBLE, width=72, height=72, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0}
|
+----------->AppCompatTextView{id=2131755262, res-name=item_drawer_text, visibility=VISIBLE, width=648, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=108.0, y=0.0, text=To Do, input-type=0, ime-target=false, has-links=false}
|
+----------->AppCompatImageView{id=2131755263, res-name=item_drawer_right_icon, desc=Notebook modified, visibility=INVISIBLE, width=54, height=54, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=756.0, y=51.0}
|
+----------->View{id=-1, visibility=VISIBLE, width=30, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=810.0, y=0.0}
|
+---------->LinearLayout{id=2131755259, res-name=item_drawer_container, visibility=VISIBLE, width=840, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=441.0, child-count=6}
|
+----------->AppCompatTextView{id=2131755260, res-name=item_drawer_active_flag, visibility=INVISIBLE, width=12, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, text=, input-type=0, ime-target=false, has-links=false}
|
+----------->View{id=-1, visibility=VISIBLE, width=24, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=12.0, y=0.0}
|
+----------->FrameLayout{id=-1, visibility=VISIBLE, width=72, height=72, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=36.0, y=36.0, child-count=1}
|
+------------>AppCompatImageView{id=2131755261, res-name=item_drawer_left_icon, desc=Drawer Item, visibility=VISIBLE, width=72, height=72, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0}
|
+----------->AppCompatTextView{id=2131755262, res-name=item_drawer_text, visibility=VISIBLE, width=648, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=108.0, y=0.0, text=Agenda, input-type=0, ime-target=false, has-links=false}
|
+----------->AppCompatImageView{id=2131755263, res-name=item_drawer_right_icon, desc=Notebook modified, visibility=INVISIBLE, width=54, height=54, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=756.0, y=51.0}
|
+----------->View{id=-1, visibility=VISIBLE, width=30, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=810.0, y=0.0}
|
+---------->LinearLayout{id=2131755259, res-name=item_drawer_container, visibility=VISIBLE, width=840, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=588.0, child-count=6}
|
+----------->AppCompatTextView{id=2131755260, res-name=item_drawer_active_flag, visibility=INVISIBLE, width=12, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, text=, input-type=0, ime-target=false, has-links=false}
|
+----------->View{id=-1, visibility=VISIBLE, width=24, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=12.0, y=0.0}
|
+----------->FrameLayout{id=-1, visibility=VISIBLE, width=72, height=72, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=36.0, y=36.0, child-count=1}
|
+------------>AppCompatImageView{id=2131755261, res-name=item_drawer_left_icon, desc=Drawer Item, visibility=VISIBLE, width=72, height=72, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0}
|
+----------->AppCompatTextView{id=2131755262, res-name=item_drawer_text, visibility=VISIBLE, width=648, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=108.0, y=0.0, text=Notebooks, input-type=0, ime-target=false, has-links=false}
|
+----------->AppCompatImageView{id=2131755263, res-name=item_drawer_right_icon, desc=Notebook modified, visibility=INVISIBLE, width=54, height=54, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=756.0, y=51.0}
|
+----------->View{id=-1, visibility=VISIBLE, width=30, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=810.0, y=0.0}
|
+---------->LinearLayout{id=2131755259, res-name=item_drawer_container, visibility=VISIBLE, width=840, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=735.0, child-count=6}
|
+----------->AppCompatTextView{id=2131755260, res-name=item_drawer_active_flag, visibility=INVISIBLE, width=12, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, text=, input-type=0, ime-target=false, has-links=false}
|
+----------->View{id=-1, visibility=VISIBLE, width=24, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=12.0, y=0.0}
|
+----------->FrameLayout{id=-1, visibility=VISIBLE, width=72, height=72, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=36.0, y=36.0, child-count=1}
|
+------------>AppCompatImageView{id=2131755261, res-name=item_drawer_left_icon, desc=Drawer Item, visibility=INVISIBLE, width=72, height=72, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0}
|
+----------->AppCompatTextView{id=2131755262, res-name=item_drawer_text, visibility=VISIBLE, width=648, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=108.0, y=0.0, text=book-one, input-type=0, ime-target=false, has-links=false}
|
+----------->AppCompatImageView{id=2131755263, res-name=item_drawer_right_icon, desc=Notebook modified, visibility=INVISIBLE, width=54, height=54, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=756.0, y=51.0}
|
+----------->View{id=-1, visibility=VISIBLE, width=30, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=810.0, y=0.0}
|
+---------->LinearLayout{id=2131755259, res-name=item_drawer_container, visibility=VISIBLE, width=840, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=882.0, child-count=6}
|
+----------->AppCompatTextView{id=2131755260, res-name=item_drawer_active_flag, visibility=INVISIBLE, width=12, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, text=, input-type=0, ime-target=false, has-links=false}
|
+----------->View{id=-1, visibility=VISIBLE, width=24, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=12.0, y=0.0}
|
+----------->FrameLayout{id=-1, visibility=VISIBLE, width=72, height=72, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=36.0, y=36.0, child-count=1}
|
+------------>AppCompatImageView{id=2131755261, res-name=item_drawer_left_icon, desc=Drawer Item, visibility=INVISIBLE, width=72, height=72, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0}
|
+----------->AppCompatTextView{id=2131755262, res-name=item_drawer_text, visibility=VISIBLE, width=648, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=108.0, y=0.0, text=book-two, input-type=0, ime-target=false, has-links=false}
|
+----------->AppCompatImageView{id=2131755263, res-name=item_drawer_right_icon, desc=Notebook modified, visibility=INVISIBLE, width=54, height=54, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=756.0, y=51.0}
|
+----------->View{id=-1, visibility=VISIBLE, width=30, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=810.0, y=0.0}
|
+---------->LinearLayout{id=2131755259, res-name=item_drawer_container, visibility=VISIBLE, width=840, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=1029.0, child-count=6}
|
+----------->AppCompatTextView{id=2131755260, res-name=item_drawer_active_flag, visibility=VISIBLE, width=12, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, text=, input-type=0, ime-target=false, has-links=false}
|
+----------->View{id=-1, visibility=VISIBLE, width=24, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=12.0, y=0.0}
|
+----------->FrameLayout{id=-1, visibility=VISIBLE, width=72, height=72, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=36.0, y=36.0, child-count=1}
|
+------------>AppCompatImageView{id=2131755261, res-name=item_drawer_left_icon, desc=Drawer Item, visibility=VISIBLE, width=72, height=72, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0}
|
+----------->AppCompatTextView{id=2131755262, res-name=item_drawer_text, visibility=VISIBLE, width=648, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=108.0, y=0.0, text=Settings, input-type=0, ime-target=false, has-links=false}
|
+----------->AppCompatImageView{id=2131755263, res-name=item_drawer_right_icon, desc=Notebook modified, visibility=INVISIBLE, width=54, height=54, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=756.0, y=51.0}
|
+----------->View{id=-1, visibility=VISIBLE, width=30, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=810.0, y=0.0}
|
+------->FrameLayout{id=2131755181, res-name=drawer_sync_container, visibility=VISIBLE, width=840, height=147, has-focus=false, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=1389.0, child-count=1}
|
+-------->LinearLayout{id=2131755225, res-name=fragment_sync_container, visibility=VISIBLE, width=840, height=147, has-focus=false, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=3}
|
+--------->ProgressBar{id=2131755226, res-name=sync_progress_bar, visibility=GONE, width=0, height=0, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=true, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0}
|
+--------->View{id=-1, visibility=VISIBLE, width=840, height=3, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0}
|
+--------->LinearLayout{id=2131755227, res-name=sync_button_container, visibility=VISIBLE, width=840, height=144, has-focus=false, has-focusable=true, has-window-focus=true, is-clickable=true, is-enabled=true, is-focused=false, is-focusable=true, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=3.0, child-count=2}
|
+---------->AppCompatImageView{id=2131755228, res-name=sync_button_icon, desc=Sync, visibility=VISIBLE, width=72, height=72, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=36.0, y=36.0}
|
+---------->AppCompatTextView{id=2131755229, res-name=sync_button_text, visibility=VISIBLE, width=732, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=108.0, y=0.0, text=Sync, input-type=0, ime-target=false, has-links=false}
|
+---->ActionBarContainer{id=2131755108, res-name=action_bar_container, visibility=VISIBLE, width=1080, height=168, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=2}
|
+----->Toolbar{id=2131755109, res-name=action_bar, visibility=VISIBLE, width=1080, height=168, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=3}
|
+------>AppCompatTextView{id=-1, visibility=VISIBLE, width=221, height=81, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=216.0, y=43.0, text=Settings, input-type=0, ime-target=false, has-links=false}
|
+------>AppCompatImageButton{id=-1, desc=Open drawer, visibility=VISIBLE, width=168, height=168, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=true, is-enabled=true, is-focused=false, is-focusable=true, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0}
|
+------>ActionMenuView{id=-1, visibility=VISIBLE, width=0, height=168, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=1080.0, y=0.0, child-count=0}
|
+----->ActionBarContextView{id=2131755110, res-name=action_context_bar, visibility=GONE, width=0, height=0, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=true, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=0}
|
+->View{id=16908336, res-name=navigationBarBackground, visibility=VISIBLE, width=1080, height=144, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=1776.0}
|
+->View{id=16908335, res-name=statusBarBackground, visibility=VISIBLE, width=1080, height=72, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0}
|
at dalvik.system.VMStack.getThreadStackTrace(Native Method)
at java.lang.Thread.getStackTrace(Thread.java:1566)
at android.support.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:92)
at android.support.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:56)
at android.support.test.espresso.ViewInteraction.runSynchronouslyOnUiThread(ViewInteraction.java:184)
at android.support.test.espresso.ViewInteraction.doPerform(ViewInteraction.java:115)
at android.support.test.espresso.ViewInteraction.perform(ViewInteraction.java:87)
at com.orgzly.android.espresso.MiscTest.testClearDatabaseWithFragmentsInBackStack(MiscTest.java:133)
at java.lang.reflect.Method.invoke(Native Method)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at android.support.test.internal.statement.UiThreadStatement.evaluate(UiThreadStatement.java:55)
at android.support.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:270)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:59)
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:262)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1932)

Tests ran to completion.

Here is the log when the test fails

You'd have to check what's going on on the device. Perhaps add some sleeps, see if the dialog with OK button is displayed. I don't see it in the view hierarchy (seems there's only a drawer and action bar in there). Maybe remove that click() on it in the test and see what happens, etc.

Creating a new test that just clicks on "Clear database", then OK button, then checks if it's in fragment_books_container would help too, as this seems to be the only place where that's being done.

BTW, there's a flicker when a note is modified from the Agenda using the swipe menu, which doesn't happen when it's done from the notebook, or search results.

Why is that detach/attach being done in AgendaFragment? Is it only to close the swipe menu, or there was some other reason as well?

I used detach/attach to reload the agenda and close the menus. I have moved the code for reloading agenda to the callbacks of the async tasks updating the notes. This way that flicker doesn't happen.

In any case, I don't think menu should be closed to be consistent with notebook and search results. We could consider adding an option later to close it on button press, and do that everywhere.

The main problem is because I create copies of the notes and use their IDs to map to the original note ID and because the copy IDs are not saved anywhere and each loading of the agenda creates new temporary IDs, I can't find a consistent way of handling the open swipe menus. Do you have any suggestions?

One more issue: long click on item in agenda, then click it again - it doesn't get unselected. Instead, count of selected items becomes 2.

Now it should work!

By making sure agenda items get the same ID when the agenda gets updated, the open swipe menu is now consistent with Query/Notebook. @nevenz, let me know if it's ok now!

I just realized that although the swipe menu behavior is correct and previous issues are resolved, the agenda list sometimes has missing items. I am a bit confused about how should I invalidate the list and reload it again when a state change happens (e.g. through swipe menu).

Try this:
create one task which repeats everyday starting today and one task which repeats every other day starting today. go to weekly agenda. starting from today mark the daily task as done using the swipe menu. After the second/third done all daily items disappear! If I reload the agenda, everything is correct. But somehow after consecutive done operations the list becomes incorrect which makes me think is because of how it is updated.

Can someone check if the way I update the agenda is correct? I have also realized that whether I explicitly reload the agenda in the async calls in MainActivity or not, or whether I use initLoader or RestartLoader in AgendaFragment, does not solve the problem and the problem can still happen at a later stage while marking tasks done in a weekly agenda.

What repeater type did you use? I assume +, as you mention marking "second/third" done. By those you mean marking one in tomorrow's display etc.?

I don't think you need any manual update. Like those reloadAgenda in MainFragment. When DB is modified (by changing the state for example), Loader should be triggered and onLoadFinished called. That why it's used actually.

So the problem was from the loaders used in AgendaFragment. Since each new agenda (e.g. daily, weekly, etc) will create a new loader, marking a task done in a weekly agenda would cause two onLoadFinished callbacks. One for the current weekly loader and another for the initially loaded daily agenda. This happens of course only when the task marked done or changed, is in both agendas. When that happens, depending on the callback order, onLoadFinished can show daily agenda results in a weekly agenda and therefore items seem to be missing.

At the moment, I keep track of the last loader id used and ignore any call to onLoadFinished if the loader passed to onLoadFinished is not the same as the current loader. I don't know if there is a better way!

I don't think you need any manual update.

I agree. I have removed the reloads. The problem was from the multiple loaders in the fragment.

What repeater type did you use?

Sorry for the unclear instructions! Essentially what I meant was to create repeating tasks and in the weekly agenda, try to mark everything as done using the swipe menu done button, starting from today and going forward day by day. You can use + or ++. Both will work. Although now I don't see the problem happening again.

Please let me know if something needs changing.

One more issue I see - selected spinner value is lost after rotating the device.

Instead of just saving the state to the bundle on configuration change, I think we might want to keep it as a preference. So that next time the user opens the app, the same type of agenda is displayed. As one will probably stick to using only one most of the time.

Not the preference in Settings, but stored in "state" shared preference (see getStateSharedPreferences usages).

I think we might want to keep it as a preference. So that next time the user opens the app, the same type of agenda is displayed.

Very good point! Done! Please have a look.

Is there anything else I need to change? How about the refactoring of the code shared with other fragments? e.g. the handlers, ...

Is there anything else I need to change? How about the refactoring of the code shared with other fragments? e.g. the handlers, ...

Sorry, I've been busy these last days, I'll get back to pull requests soon. I'll see to make them a priority in the future, which they should be.

I don't remember any serious issues in code last time I checked, though any DRY-ing sounds good. I'm gonna release 1.5.1 next with some bug fixes, then we can include this in 1.6, as it's a big feature.

I've fixed few bugs and changed few things. There's more to be done, but should be good enough for v1.6. Thanks!

:clap: Just want to give @pxsalehi a round of applause for implementing this much needed feature, and @nevenz for providing guidance. This may allow me (and many others) to fully drop traditional calendar applications. Great work guys!

Was this page helpful?
0 / 5 - 0 ratings