<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Mihael Francekovic on Medium]]></title>
        <description><![CDATA[Stories by Mihael Francekovic on Medium]]></description>
        <link>https://medium.com/@0ximDigital?source=rss-beb666db1c6b------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*8oUDuZ5tDR6dLqx7.jpg</url>
            <title>Stories by Mihael Francekovic on Medium</title>
            <link>https://medium.com/@0ximDigital?source=rss-beb666db1c6b------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 19:13:10 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@0ximDigital/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[The Bullseye: How We Fitted a Piece of Hardware to Any Mobile Device]]></title>
            <link>https://medium.com/hi-five/the-bullseye-how-we-fitted-a-piece-of-hardware-to-any-device-80c4e6ae9e3f?source=rss-beb666db1c6b------2</link>
            <guid isPermaLink="false">https://medium.com/p/80c4e6ae9e3f</guid>
            <category><![CDATA[mobile-app-development]]></category>
            <category><![CDATA[projects]]></category>
            <category><![CDATA[development]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[ux]]></category>
            <dc:creator><![CDATA[Mihael Francekovic]]></dc:creator>
            <pubDate>Mon, 26 Mar 2018 15:50:11 GMT</pubDate>
            <atom:updated>2018-03-26T17:07:13.950Z</atom:updated>
            <content:encoded><![CDATA[<h4>Building a seamless interaction between an app and its hardware extension</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*L6Z_NIK_ytAEPUWgJfJzgA.jpeg" /></figure><p>Let me tell you a story about <a href="http://five.agency/projects/moonlite/">the Moonlite App</a>. An app that turns your mobile phone into a story-time projector and works seamlessly with the hardware extension, providing modern parents to tell stories like never before. When we first encountered with the Moonlite idea, to be honest, it sounded a bit like a fairytale. But in a right way. Let us explain how we hit the <strong>Bullseye</strong>.</p><h3>The Idea</h3><p>Moonlite started off as a crowdfunding idea and managed to raise <strong>$350.000 </strong>on <a href="https://www.kickstarter.com/projects/1483155071/moonlite-a-bedtime-story-projector-for-your-mobile">Kickstarter</a> and even more on <a href="https://www.kickstarter.com/projects/1483155071/moonlite-a-bedtime-story-projector-for-your-mobile">Indiegogo</a>. Five got the chance to bring this marvelous idea to life.</p><p>This time, it all started with the hardware. We got a clip projector, engineered with an idea to work with an app on the mobile phone. It wasn’t the first time we worked on the app that worked in pair with a piece of hardware. We knew what we were doing. But still, knew that we would have to overcome some severe challenges if we wanted to enable a device aiming to revolutionize the storytelling process.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*GwD_HASjmcx6VdoniSUdYg.png" /></figure><h3>Brainstorming And User Testing</h3><p>So, we rolled up our sleeves and started brainstorming. The first goal was to explain to a user how the projector works, and secondly, to help the user with the usage of the projector.</p><p>As always, our team had a wide range of ideas. Should we go with the simple onboarding? Should we go with an animated onboarding? Maybe a video tutorial instead?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*aTWIijjdFWsHkf9igqkpTQ.jpeg" /><figcaption>Moonlite team brainstorming</figcaption></figure><h3>The Real Challenge</h3><p>After a round of user testing, we got answers to some of our questions. Most of the users seemed to get a hold of the projector after a few tries, but many of them had problems with the process of attaching the projector. Users were turning their phones around, upside down. It was clumsy and troublesome.</p><p><strong>And then it hit us</strong>. Why don’t we give our users a target on the phone screen to indicate where a projector clip should be? So we arranged another user testing. This time, we presented the users a simple target for the projector clip. It worked like a charm.</p><blockquote><em>“Users were turning their phones around, upside down. It was clumsy and troublesome.”</em></blockquote><h3>Target Design: The Concept of The Bullseye</h3><p>We made a final decision, and created an animated onboarding with the help of an on-screen target, to guide users with the projector. We called it <strong>The Bullseye</strong>, and it looked like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/433/0*QDYDTI1SgpOP8hP2.gif" /><figcaption>Moonlite App onboarding</figcaption></figure><p>Users could now try out the projector as they are advancing through the onboarding.</p><h3>Implementation</h3><p>The users loved The Bullseye, and it looked great, but we had another problem: <strong>how on Earth should we implement a thing like that?</strong></p><p>As an engineer, one of the first challenges I thought of, was <strong>how to get the screen coordinates for a wide variety of (primarily) Android devices out there</strong>? Screen coordinates are different for every android hardware model because coordinates depend on the position of the flashlight on the device.</p><p>Furthermore, we wanted to be able to update coordinates on the fly, without the need to update the app in the store. For that, we needed back-end support. A device should fetch proper coordinates and display The Bullseye.</p><p>This means that we must map some device information to the coordinates on the back-end. After some research and testing, we found that a device model is best suited to our needs. Luckily, Android exposes API to get the model of a device user is using easily — <em>Build.MODEL</em></p><p>Saving coordinate values seemed straightforward, just take the pixel values of the bullseye and you are done. But did you know that some Android devices can change the screen resolution? A logical approach to handle changing screen resolutions would be to store coordinates as a percentage of the width and height of the screen. So, we did just that.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/405/0*1xDfO2pPbCfInVhC.gif" /><figcaption>The Bullseye App in action</figcaption></figure><p>All we had to do now is to take out the ruler, and measure every possible device, determine bullseye coordinates, and store them on the server. Right? Wrong. We are developers, and we work with code, not rulers.</p><h3>There’s an App For That</h3><p>So you’re telling me there’s an app that replaces rulers and does all the measuring of our coordinates in pixels? Of course not. And so we made one.</p><p>Workflow is simple, we attach the projector to a device, adjust it so that projected image is just as we like it. We move on-screen bullseye to match physical clip and hit the Send/Save button to send coordinates to our back-end.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/438/0*oUnOML9nBR8XaXsO.gif" /><figcaption>The Bullseye demonstration</figcaption></figure><p>Devices with the same model identifier can immediately use these new coordinates and show a bullseye to help users with the projector alignment.</p><p>There is one thing that we learned the hard way though, devices that are physically the same can have different model numbers that we get with <em>Build.MODEL</em></p><p><a href="https://docs.google.com/spreadsheets/d/16gXm7mGsXY_wQjTsRJYQVKkIjR8c3v-MAliAiRs0E3c/pub?gid=0&amp;single=true&amp;output=pdf">Here</a> is a handy list of google play supported devices and model value they will return. When coordinates have to be created or updated from the bullseye app we search for a group of model identifiers where the given model is, and update coordinates for the whole group.</p><h3>To Sum It Up</h3><p>Building a seamless interaction between your app and its hardware extension is not easy nor straightforward. <strong>But it is definitely worth it.</strong></p><p>Tools that help you out along the way can mean a lot. Don’t hesitate to create your own tools, you will learn a lot making them and probably solve your challenges faster. Sometimes, the tools you create can become a part of the app experience themselves. The next plan for the handy bullseye app that we are looking into is to incorporate it into the app.</p><p>Coordinates for the devices that we did not collect could be given to us by the users. It helps us, the user, and all of the other users that use the app.</p><blockquote><em>Don’t hesitate to create your own tools, you will learn a lot making them and probably solve your challenges faster.</em></blockquote><p>What do you think about these challenges and our solutions? Would you choose a different approach?</p><p><em>If you liked this article, head over to the </em><a href="https://itunes.apple.com/app/moonlite-storytime-projector/id1292405538"><em>App</em></a><em>/</em><a href="https://play.google.com/store/apps/details?id=com.spinmaster.moonlite"><em>Play</em></a><em> store and check out the rest of the </em><a href="https://mymoonlite.com/"><em>Moonlite App</em></a><em>.</em></p><p><strong><em>Thank you for reading. If you like the article, please click the👏 below so others can find it too — it would really mean a lot to me. :)</em></strong></p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fupscri.be%2F43001d%3Fas_embed%3Dtrue&amp;url=https%3A%2F%2Fupscri.be%2F43001d%2F&amp;image=https%3A%2F%2Fe.enpose.co%2F%3Fkey%3DdRXnS9Gplk%26w%3D700%26h%3D425%26url%3Dhttps%253A%252F%252Fupscri.be%252F43001d%252F%253Fenpose&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=upscri" width="800" height="400" frameborder="0" scrolling="no"><a href="https://medium.com/media/5f4372f3cdcb6c1ee83318300a47c0a5/href">https://medium.com/media/5f4372f3cdcb6c1ee83318300a47c0a5/href</a></iframe><p><a href="http://five.agency/"><em>Five</em></a><em> is a </em><strong><em>mobile design and development agency</em></strong><em> with offices in Croatia and </em>NYC.</p><p><em>Originally published at </em><a href="http://five.agency/moonlite-bullseye/"><em>five.agency</em></a><em> on March 26, 2018.</em></p><p><em>Photos: Hrvoje Mihajlic</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=80c4e6ae9e3f" width="1" height="1" alt=""><hr><p><a href="https://medium.com/hi-five/the-bullseye-how-we-fitted-a-piece-of-hardware-to-any-device-80c4e6ae9e3f">The Bullseye: How We Fitted a Piece of Hardware to Any Mobile Device</a> was originally published in <a href="https://medium.com/hi-five">Hi, Five!</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>