Bill Farmer

Random thoughts on random subjects

Parsing markdown to create a mindmap

by Bill Farmer. Categories: hacking .

I was requested to investigate importing a markdown mindmap into my MindMap app. The app uses the MindMapView library for the display. There is a commonmark library that I have used in other apps to handle markdown, so I investigated if it is possible to use it for this.

The library provides an AbstractVisitor which you may use to visit the tree of nodes generated by the parser. Because at least one implementation of MarkMap uses YAML front matter to define the title/root node there is a YamlFrontMatterExtension and a YamlFrontMatterVisitor to deal with that.

Read more →

Beach Villas

by Bill Farmer. Categories: Travel .

On a variety of holidays we have come across a wide range of interesting development opportunities.

Cahir

Irish rural retreat near Cahir, Ireland. Some rethatching required.

Caerphilly

Pretty Welsh country cottage near Caerphilly, UK. Natural slate roof.

Zahora

On the beach at Zahora, Costa de Luz, Spain. This has since been turned into a beach bar. The lighthouse at Trafalgar can be seen in the distance.

Olveira

Country cottage near Olveira, Galicia, Spain. Sturdy chimney.

Read more →

Flutter app bar search widget

by Bill Farmer. Categories: Hacking .

As an exercise I decided to reimplement my Buses app in flutter. To do this I need an open street map library, a beautiful soup library, a location library, an OS ref library, and a search widget. All of these are available in pub.dev, except a suitable search widget. All implementations of SearchBar in the docs include an annoying dropdown suggestions feature, which appears to be mandatory.

BusApp

However it is possible to take the SearchBar and include it in an AppBar, change the icons and end up with something which looks and acts very similarly to an android search widget. To do this, add code to the actions of the app bar which either shows an icon button or the search bar, controlled by a boolean which is set by pressing the search button. The search bar is wrapped by an Expanded widget to stop it overflowing the display. The search bar has a leading button which dismisses it, a conditional trailing button to clear the search field and a button to do the search.

Read more →

Android Navigation Menu

by Bill Farmer. Categories: Hacking .

Android versions from android 5 use a Toolbar as the ActionBar, but there appears to be no obvious API access.

However, by traversing the view hierarchy, it can be found and used to set up app navigation.

Navigation

Create a recursive function to traverse the views and find the toolbar.

    // findToolbar
    private Toolbar findToolbar(ViewGroup group)
    {
        View result = null;
        final int count = group.getChildCount();
        for (int i = 0; i < count; i++)
        {
            View view = group.getChildAt(i);
            if (view instanceof Toolbar)
                return (Toolbar) view;

            if (view instanceof ViewGroup)
                result = findToolbar((ViewGroup) view);

            if (result != null)
                break;
        }

        return (Toolbar) result;
    }

Having written this hack, I then discovered a more efficient way using built in functionality.

Read more →

Update App Widget

by Bill Farmer. Categories: Hacking .

Android app widgets normally can be set up to update periodically, but not repeatedly for a short period. For a bus times app I need the widget to update every 30 seconds for about 5 minutes.

I already had a Service set up to update the widget from a suitable web site and using a Handler to reset the progress bar if the background update process failed.

    public static final int RESET_DELAY = 5 * 1000;
    public static final int REPEAT_DELAY = 30 * 1000;
    public static final int STOP_DELAY = 5 * 60 * 1000;

    private Handler handler;
    private boolean stopUpdate;

    // onCreate
    @Override
    public void onCreate()
    {
        // Get handler
        handler = new Handler(Looper.getMainLooper());

        if (BuildConfig.DEBUG)
            Log.d(TAG, "onCreate " + handler);
    }

Define the various delays and get a handler in the onCreate() method.

Read more →
Previous page Next page