<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mobile USTP MKL</title>
	<atom:link href="https://mobile.fhstp.ac.at/feed/" rel="self" type="application/rss+xml" />
	<link>https://mobile.fhstp.ac.at/</link>
	<description>Die &#34;Mobile Forschungsgruppe&#34; der USTP, sie  sammelt hier alles zu den Themen Design, UX und Entwicklung mobiler Applikationen</description>
	<lastBuildDate>Thu, 07 May 2026 07:02:39 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://mobile.fhstp.ac.at/wp-content/uploads/2025/03/icon-120x120.webp</url>
	<title>Mobile USTP MKL</title>
	<link>https://mobile.fhstp.ac.at/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Wild Week &#8211; Wyld Interactive Media Player</title>
		<link>https://mobile.fhstp.ac.at/allgemein/wild-week-wyld-interactive-media-player/</link>
					<comments>https://mobile.fhstp.ac.at/allgemein/wild-week-wyld-interactive-media-player/#respond</comments>
		
		<dc:creator><![CDATA[Sander Hahn]]></dc:creator>
		<pubDate>Thu, 07 May 2026 07:02:37 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<guid isPermaLink="false">https://mobile.fhstp.ac.at/?p=15824</guid>

					<description><![CDATA[<p>For our Wild Week project, we created WIMP (Wyld Interactive Media Player). WIMP is an engine designed to handle branching, interactive video content similar to Netflix’s interactive specials. But WIMP can not only play videos, but also show other media like pictures, texts and audio in an interactive way. The goal Our goal was to <a class="read-more" href="https://mobile.fhstp.ac.at/allgemein/wild-week-wyld-interactive-media-player/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/wild-week-wyld-interactive-media-player/">Wild Week &#8211; Wyld Interactive Media Player</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>For our Wild Week project, we created <strong>WIMP</strong> (Wyld Interactive Media Player). WIMP is an engine designed to handle branching, interactive video content similar to Netflix’s interactive specials. But WIMP can not only play videos, but also show other media like pictures, texts and audio in an interactive way. </p>



<h2 class="wp-block-heading">The goal</h2>



<p>Our goal was to create a prototype that plays media that isn&#8217;t just linear. We wanted a way to inject logic, like quizzes, info overlays, and decision points, directly into the media timeline. It doesn&#8217;t matter if it&#8217;s a certain position on a text or a specific time in a video.</p>



<p>To make this work across different platforms, we first had to define a standardized data structure. This led to the development of the <strong>WIMP format</strong>.</p>



<p>Another important part of this project is a media player that is highly mobile optimized and easy to understand, so that even a five year old can experience a WIMP interactive medium.</p>



<p>The project is split into two distinct layers: the data standard and the playback engine.</p>



<h2 class="wp-block-heading">Architecture</h2>



<h3 class="wp-block-heading">1. The Format</h3>



<p>Before building the player, we needed a predictable way to describe the media content. For this, we had to design a format that incooperates everything a WIMP user needs and will need in the future. This forward thinking and upgradeability of our format was one of the main challenges that we faced during this Wild Week. We ended up with an open-format JSON schema that defines a graph of &#8220;media nodes.&#8221; Each node can contain:</p>



<ul class="wp-block-list">
<li><strong>Timed Events:</strong> Quizzes, info texts, external links and more that can be triggered at specific timestamps.</li>



<li><strong>Choice Events:</strong> Branching points that tell the player which media node to load next.</li>
</ul>



<p>By publishing this as an NPM package, we integrated a validator directly into the workflow, ensuring that any content loaded by the player is structurally sound and free of dead ends.</p>



<p>Here&#8217;s an example format:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
{
    &quot;version_number&quot;: &quot;0.0.1&quot;,
    &quot;format_type&quot;: &quot;wimp&quot;,
    &quot;meta_data&quot;: {
        &quot;id&quot;: &quot;7f6b6d2d-8fb7-4bd4-9f2a-5a1e2d7c6b42&quot;,
        &quot;created_at&quot;: &quot;2026-04-23T00:00:00+02:00&quot;,
        &quot;updated_at&quot;: &quot;2026-04-23T00:00:00+02:00&quot;,
        &quot;author&quot;: &quot;Melanie Maier&quot;,
        &quot;title&quot;: &quot;What If Dinosaurs Still Lived Today?&quot;,
        &quot;start_media_id&quot;: &quot;dinosaur_intro_text&quot;,
        &quot;description&quot;: &quot;An interactive documentary exploring the hypothetical scenario of dinosaurs still existing in the modern world.&quot;,
        &quot;tags&quot;: &#x5B;
            &quot;dinosaurs&quot;,
            &quot;interactive documentary&quot;,
            &quot;hypothetical scenario&quot;,
            &quot;modern world&quot;
        ]
    },
    &quot;media&quot;: &#x5B;{
            &quot;id&quot;: &quot;dinosaur_intro_text&quot;,
            &quot;title&quot;: &quot;Introduction&quot;,
            &quot;type&quot;: &quot;text&quot;,
            &quot;resource_link&quot;: &quot;https://wimplayer.media.ustp.at/media.php?name=dinosaurs_intro.html&quot;,
            &quot;timeline_events&quot;: &#x5B;{
                &quot;type&quot;: &quot;choice&quot;,
                &quot;title&quot;: &quot;Do you want hear about dinosaurs?&quot;,
                &quot;position&quot;: {
                    &quot;type&quot;: &quot;seconds&quot;,
                    &quot;value&quot;: 0
                },
                &quot;event_context&quot;: {
                    &quot;choices&quot;: &#x5B;{
                        &quot;label&quot;: &quot;Start the journey&quot;,
                        &quot;next_media&quot;: &quot;dinosaur_audio1&quot;
                    }]
                }
            }]
        },
        {
            &quot;id&quot;: &quot;dinosaur_audio1&quot;,
            &quot;title&quot;: &quot;Audio 1&quot;,
            &quot;type&quot;: &quot;audio&quot;,
            &quot;resource_link&quot;: &quot;https://wimplayer.media.ustp.at/media.php?name=dinosaur_1.mp3&quot;,
            &quot;timeline_events&quot;: &#x5B;{
                    &quot;type&quot;: &quot;quiz&quot;,
                    &quot;title&quot;: &quot;What would be the most likely immediate response from modern states once the existence of large living dinosaurs was confirmed?&quot;,
                    &quot;position&quot;: {
                        &quot;type&quot;: &quot;seconds&quot;,
                        &quot;value&quot;: 5
                    },
                    &quot;event_context&quot;: {
                        &quot;answers&quot;: &#x5B;{
                                &quot;label&quot;: &quot;Opening all affected regions to tourism&quot;,
                                &quot;is_correct&quot;: false,
                                &quot;feedback&quot;: &quot;&quot;
                            },
                            {
                                &quot;label&quot;: &quot;Establishing exclusion zones and interdisciplinary crisis task forces&quot;,
                                &quot;is_correct&quot;: true,
                                &quot;feedback&quot;: &quot;&quot;
                            },
                            {
                                &quot;label&quot;: &quot;Immediately classifying all species as domesticated animals&quot;,
                                &quot;is_correct&quot;: false,
                                &quot;feedback&quot;: &quot;&quot;
                            },
                            {
                                &quot;label&quot;: &quot;Suspending all ongoing scientific research&quot;,
                                &quot;is_correct&quot;: false,
                                &quot;feedback&quot;: &quot;&quot;
                            }
                        ]
                    }
                },
                {
                    &quot;type&quot;: &quot;quiz&quot;,
                    &quot;title&quot;: &quot;Why would the discovery of living dinosaurs be more than just a zoological sensation?&quot;,
                    &quot;position&quot;: {
                        &quot;type&quot;: &quot;seconds&quot;,
                        &quot;value&quot;: 30
                    },
                    &quot;event_context&quot;: {
                        &quot;answers&quot;: &#x5B;{
                                &quot;label&quot;: &quot;Because it would automatically replace all existing animal species&quot;,
                                &quot;is_correct&quot;: false,
                                &quot;feedback&quot;: &quot;&quot;
                            },
                            {
                                &quot;label&quot;: &quot;Because modern cities are already designed for giant reptiles &quot;,
                                &quot;is_correct&quot;: false,
                                &quot;feedback&quot;: &quot;&quot;
                            }, {
                                &quot;label&quot;: &quot;Because it would challenge long-held assumptions about ecology, history, and risk planning&quot;,
                                &quot;is_correct&quot;: true,
                                &quot;feedback&quot;: &quot;Still too high. Fast fashion is often discarded quickly.&quot;
                            },
                            {
                                &quot;label&quot;: &quot;Because dinosaurs could only survive in artificial reserves &quot;,
                                &quot;is_correct&quot;: false,
                                &quot;feedback&quot;: &quot;&quot;
                            }
                        ]
                    }
                },
                {
                    &quot;type&quot;: &quot;choice&quot;,
                    &quot;title&quot;: &quot;Do you want to hear more about this scenario?&quot;,
                    &quot;position&quot;: {
                        &quot;type&quot;: &quot;seconds&quot;,
                        &quot;value&quot;: 60
                    },
                    &quot;event_context&quot;: {
                        &quot;choices&quot;: &#x5B;{
                            &quot;label&quot;: &quot;Yes please&quot;,
                            &quot;next_media&quot;: &quot;dinosaur_audio2&quot;
                        }]
                    }
                }
            ],
            &quot;description&quot;: &quot;Quick cuts of clothing store racks, online shopping scrolls, and factory workers sewing.&quot;,
            &quot;media_length&quot;: 76
        },
        {
            &quot;id&quot;: &quot;dinosaur_audio2&quot;,
            &quot;title&quot;: &quot;Dinosaur 2&quot;,
            &quot;type&quot;: &quot;audio&quot;,
            &quot;resource_link&quot;: &quot;https://wimplayer.media.ustp.at/media.php?name=dinosaur_2.wav&quot;,
            &quot;timeline_events&quot;: &#x5B;{
                    &quot;type&quot;: &quot;quiz&quot;,
                    &quot;title&quot;: &quot;Which dinosaur group would likely be the hardest to control in a modern civilization?&quot;,
                    &quot;position&quot;: {
                        &quot;type&quot;: &quot;seconds&quot;,
                        &quot;value&quot;: 5
                    },
                    &quot;event_context&quot;: {
                        &quot;answers&quot;: &#x5B;{
                                &quot;label&quot;: &quot;Small to medium-sized, intelligent, highly adaptable predators&quot;,
                                &quot;is_correct&quot;: true,
                                &quot;feedback&quot;: &quot;&quot;
                            },
                            {
                                &quot;label&quot;: &quot;Very large, slow-moving herbivores&quot;,
                                &quot;is_correct&quot;: false,
                                &quot;feedback&quot;: &quot;&quot;
                            },
                            {
                                &quot;label&quot;: &quot;Flightless species living only in remote areas&quot;,
                                &quot;is_correct&quot;: false,
                                &quot;feedback&quot;: &quot;&quot;
                            },
                            {
                                &quot;label&quot;: &quot;Species with strongly territorial but fixed-range behavior&quot;,
                                &quot;is_correct&quot;: false,
                                &quot;feedback&quot;: &quot;&quot;
                            }
                        ]
                    }
                },
                {
                    &quot;type&quot;: &quot;quiz&quot;,
                    &quot;title&quot;: &quot;Which societal conflict would be most likely if humans and dinosaurs had to coexist permanently?&quot;,
                    &quot;position&quot;: {
                        &quot;type&quot;: &quot;seconds&quot;,
                        &quot;value&quot;: 35
                    },
                    &quot;event_context&quot;: {
                        &quot;answers&quot;: &#x5B;{
                                &quot;label&quot;: &quot;Whether dinosaurs should be included in school curricula &quot;,
                                &quot;is_correct&quot;: false,
                                &quot;feedback&quot;: &quot;&quot;
                            },
                            {
                                &quot;label&quot;: &quot;The complete abolition of modern infrastructure&quot;,
                                &quot;is_correct&quot;: false,
                                &quot;feedback&quot;: &quot;&quot;
                            },
                            {
                                &quot;label&quot;: &quot;A global abandonment of agriculture&quot;,
                                &quot;is_correct&quot;: false,
                                &quot;feedback&quot;: &quot;&quot;
                            },
                            {
                                &quot;label&quot;: &quot;A conflict between species protection, public safety, and economic use of land&quot;,
                                &quot;is_correct&quot;: true,
                                &quot;feedback&quot;: &quot;&quot;
                            }
                        ]
                    }
                },
                {
                    &quot;type&quot;: &quot;choice&quot;,
                    &quot;title&quot;: &quot;Do you want to read more?&quot;,
                    &quot;position&quot;: {
                        &quot;type&quot;: &quot;seconds&quot;,
                        &quot;value&quot;: 55
                    },
                    &quot;event_context&quot;: {
                        &quot;choices&quot;: &#x5B;{
                            &quot;label&quot;: &quot;Yes please&quot;,
                            &quot;next_media&quot;: &quot;dinosaur_end_text&quot;
                        }]
                    }
                }
            ],
            &quot;description&quot;: &quot;Dinosaur audio&quot;,
            &quot;media_length&quot;: 59
        },
        {
            &quot;id&quot;: &quot;dinosaur_end_text&quot;,
            &quot;title&quot;: &quot;End&quot;,
            &quot;type&quot;: &quot;text&quot;,
            &quot;resource_link&quot;: &quot;https://wimplayer.media.ustp.at/media.php?name=dinosaurs_end.html&quot;,
            &quot;timeline_events&quot;: &#x5B;]
        }
    ]
}
</pre></div>


<h3 class="wp-block-heading">2. The Frontend: Nuxt &amp; Logic</h3>



<p>The player itself is built with <strong>Nuxt</strong>. We chose Nuxt because its reactive framework is ideal for syncing a video’s progress with dynamic UI overlays.</p>



<p>For this we split our team into 2 departments: </p>



<ul class="wp-block-list">
<li>The UI/UX of the main page and components</li>



<li>The player with the state machine</li>
</ul>



<h4 class="wp-block-heading">Main Page &amp; Components UI/UX</h4>



<p>For prototyping and designing our pages and components, we decided on using Figma with Nuxt&#8217;s components to help us out. Here are some examples of our pages and components:</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="402" height="800" data-id="15826" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/04/Template_-Dahsboard-402x800.png" alt="" class="wp-image-15826"/></figure>



<figure class="wp-block-image size-large"><img decoding="async" width="402" height="800" data-id="15840" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/04/Template_-Video-1-402x800.png" alt="" class="wp-image-15840"/></figure>



<figure class="wp-block-image size-large"><img decoding="async" width="402" height="800" data-id="15836" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/04/Template_-Audio-1-402x800.png" alt="" class="wp-image-15836"/></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="402" height="800" data-id="15835" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/04/Template_-Text-1-402x800.png" alt="" class="wp-image-15835"/></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="402" height="800" data-id="15834" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/04/Template_-Media-Description3-1-402x800.png" alt="" class="wp-image-15834"/></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="402" height="800" data-id="15838" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/04/Template_-Media-Description1-1-402x800.png" alt="" class="wp-image-15838"/></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="402" height="800" data-id="15839" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/04/Template_-Media-Description-1-402x800.png" alt="" class="wp-image-15839"/></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="402" height="800" data-id="15837" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/04/Template_-Media-Description2-1-402x800.png" alt="" class="wp-image-15837"/></figure>
</figure>



<h4 class="wp-block-heading">State Machine</h4>



<p>To manage the complexity of interactive playback, we implemented a <strong>state machine</strong>. The state machine coordinates:</p>



<ul class="wp-block-list">
<li><strong>Syncing Logic:</strong> Monitoring the video’s <code>currentTime</code> to trigger overlays from the WIMP format.</li>



<li><strong>Interaction States:</strong> When a <code>pause: true</code> event occurs, the machine pauses the background media, putting the quiz or choice interface in the foreground.</li>



<li><strong>Dynamic Media Handling:</strong> When a user makes a choice, the machine resolves the <code>next_media</code> ID and updates the Nuxt state to swap the media and move forward in the decission tree.</li>
</ul>



<p></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/wild-week-wyld-interactive-media-player/">Wild Week &#8211; Wyld Interactive Media Player</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mobile.fhstp.ac.at/allgemein/wild-week-wyld-interactive-media-player/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Print2Mobile &#124; Audio Book &#8211; Static Web APP</title>
		<link>https://mobile.fhstp.ac.at/allgemein/print2mobile-audio-book-static-web-app/</link>
		
		<dc:creator><![CDATA[Csongor]]></dc:creator>
		<pubDate>Thu, 19 Mar 2026 08:03:46 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[Print-to-mobile]]></category>
		<category><![CDATA[QR-Code]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Web-App]]></category>
		<guid isPermaLink="false">https://mobile.fhstp.ac.at/?p=14984</guid>

					<description><![CDATA[<p>A book titled Flightpath filled to the brim with interesting facts, stories and visuals about aviation, but the question remains: How could we add even more value to an already great product.</p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/print2mobile-audio-book-static-web-app/">Print2Mobile | Audio Book &#8211; Static Web APP</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p style="font-size:1.2rem"><em>A book titled Flightpath filled to the brim with interesting facts, stories and visuals about aviation, but the question remains: How could we add even more value to an already great product.</em></p>



<p class="has-large-font-size"><strong>Project Overview</strong></p>



<p>To start off I invented a fictional product to which our lectures topic, Print to Mobile(Web) and the use of QR Codes can be applied to. I worked to gain added value for the product, as the title suggest my approach was by extending the physical product with a digital audio book. The project aims to provide an immersive experience through the scanning process and accommodate readers who may prefer to listen to books over reading or just want to listen while being occupied by something else.</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="1024" height="1536" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/cover-print-7.jpg" alt="" class="wp-image-15035" style="width:450px"/></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="895" height="385" src="https://mobile.fhstp.ac.at/wp-content/uploads/2025/10/image-6.png" alt="" class="wp-image-15036"/></figure>



<p>A moment after the QR code is scanned the user is met with a book that opens its cover (the same as the physical book cover) and reviles an audio player where the user can listen to the audio book. Test it your self <a href="https://curious-mousse-8bd688.netlify.app/?auto=1">HERE</a>.</p>
</div>
</div>



<p class="has-large-font-size"><strong>Implementation</strong></p>



<p>I decided to create a static web application as the title suggests. This was in order to simplify the project by having no server side. For the creation of the app I used a famous front end framework called <a href="https://nuxt.com/">Nuxt.js </a>that is based on <a href="https://vuejs.org/">Vue.js</a> for template files. Following the chronological order of how the user would encounter interact with the app. The opening of the book cover is created using <a href="https://tailwindcss.com/">Tailwindcss</a> and some additional custom css code where the built in tools of tailwind were not enough. When the book is opened the user encounters the audio player which is created using the <a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API">Web Audio API</a> that is available in the browser by default. Finally I used the extremely user friendly deployment service of <a href="https://www.netlify.com/">Netlify</a> to publish my application to the web within minutes.</p>



<p class="has-large-font-size"><strong>Summary</strong></p>



<p>The product of this project is a prototype that shows how there can be added value to an existing products by incorporating the Print2Mobile concept. Future iterations of the project could also make use of augmented reality to further enhance the book by showing the plane models &#8220;pop-out&#8221; of the book through the users cameras into their surroundings and allow them to have a closer look.</p>



<p>I personally had fun seeing what&#8217;s the most creative way I can integrate the Print2Mobile concept in my project.</p>



<p>Find the application at: <a href="https://curious-mousse-8bd688.netlify.app/?auto=1">https://curious-mousse-8bd688.netlify.app/?auto=1</a><br><br><strong>Disclaimer: </strong><em>This is a personal project created for educational and illustrative purposes. It is not affiliated with any existing organizations or products.</em></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/print2mobile-audio-book-static-web-app/">Print2Mobile | Audio Book &#8211; Static Web APP</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Freemium, Subscriptions, and Ads: A Technical and Economic Look at App Revenues</title>
		<link>https://mobile.fhstp.ac.at/allgemein/freemium-subscriptions-and-ads-a-technical-and-economic-look-at-app-revenues/</link>
		
		<dc:creator><![CDATA[Kevin Kraushofer]]></dc:creator>
		<pubDate>Mon, 09 Mar 2026 10:26:08 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<guid isPermaLink="false">https://mobile.fhstp.ac.at/?p=15805</guid>

					<description><![CDATA[<p>Whether it&#8217;s social media apps, games, or news, all these apps are offered for free nowadays. For us users, it has become a habit not to pay anything for software on our phones. Hard to believe: Back in 2009, a proud 77% of apps in the App Store were paid. Today, that number is just <a class="read-more" href="https://mobile.fhstp.ac.at/allgemein/freemium-subscriptions-and-ads-a-technical-and-economic-look-at-app-revenues/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/freemium-subscriptions-and-ads-a-technical-and-economic-look-at-app-revenues/">Freemium, Subscriptions, and Ads: A Technical and Economic Look at App Revenues</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Whether it&#8217;s social media apps, games, or news, all these apps are offered for free nowadays. For us users, it has become a habit not to pay anything for software on our phones.</p>



<p>Hard to believe: Back in 2009, a proud 77% of apps in the App Store were paid. Today, that number is just 4.9%. Because of this, it is increasingly difficult for developers to find indirect or even invisible ways to finance server costs and their own work. Nevertheless, giants like Snapchat, WhatsApp, Instagram, or Facebook manage to be part of a multi-billion dollar economic empire, even though their download button says &#8220;Free&#8221;. How does that add up?</p>



<p>In this blog post, we will take a look at the three biggest monetization strategies, their technical hurdles, and why the classic &#8220;pay once&#8221; model is almost extinct.</p>



<h2 class="wp-block-heading"><strong>In-App Advertising</strong></h2>



<p>In-app advertising remains the most well-known and successful method of app monetization. These are ads that users see while using the app. According to Netimperative, this leads to up to a 12% increase in users&#8217; purchase intent. The most common formats are:</p>



<ul class="wp-block-list">
<li><strong>Banner Ads:</strong> Small ads, usually at the top or bottom edge of the screen.</li>



<li><strong>Video Ads:</strong> Short clips played before or during use.</li>



<li><strong>Interstitial Ads:</strong> Full-screen ads that often appear during natural pauses (e.g., after completing a level).</li>



<li><strong>Native Ads:</strong> Ads that blend seamlessly into the visual design of the app.</li>
</ul>



<p>These formats are typically found in social media apps, news apps, and very frequently in gaming apps.</p>



<h2 class="wp-block-heading"><strong>In-App Purchases</strong></h2>



<p>In addition to in-app advertising, developers can generate revenue through in-app purchases. This method is especially popular in the gaming sector. The business model behind it is that players can acquire skins, items, or objects. This type of monetization is also often exploited through the &#8220;Pay-to-Win&#8221; pattern. In this scenario, purchases are offered that give players an unfair advantage over others. Games are often specifically designed to offer helpful (but paid) items at particularly tricky spots. For example, to skip a level or gain more power.</p>



<p>Generally, we distinguish between two categories:</p>



<ul class="wp-block-list">
<li><strong>Consumables:</strong> In-game currency (coins/gems), health points, power-ups, or building materials. These can be bought over and over again.</li>



<li><strong>Non-Consumables:</strong> Unlocking hidden levels, new characters, or cosmetic goods like &#8220;skins&#8221; and outfits. These are purchased only once.</li>
</ul>



<h2 class="wp-block-heading"><strong>Freemium</strong></h2>



<p>With the freemium model (a portmanteau of &#8220;free&#8221; and &#8220;premium&#8221;), the basic version of the app is completely free. However, if you want to use additional features, exclusive content, or an ad-free environment, you hit a so-called paywall. The goal is simple: users should get to know and love the app, so they are then willing to invest in the best user experience. The most prominent example of this is Spotify. You can easily use the service for free, but you have to take out a monthly subscription for features like offline listening, unrestricted song selection, and the removal of ads.</p>



<h2 class="wp-block-heading"><strong>Technical Implementation: How Does the Money Get Into the App?</strong></h2>



<p>Integrating these monetization models into an app requires some technical groundwork. Fortunately, developers no longer write these systems entirely from scratch; instead, they rely on proven interfaces. For ad integration, so-called SDKs (Software Development Kits) from large ad networks like Google AdMob or Unity Ads are embedded directly into the code. These communicate with the servers in the background and fetch perfectly tailored ads in real-time.</p>



<p>When it comes to in-app purchases and subscriptions, the payment processing doesn&#8217;t go through the developer&#8217;s private bank account, but always through the secure infrastructure of the respective operating system. Apple provides the StoreKit framework, and Android offers the Google Play Billing API. To ensure everything is secure and fraud is prevented during these transactions, server-side validation is essential. The app&#8217;s backend directly asks Apple or Google whether the user&#8217;s digital receipt is actually genuine before virtual items or premium features are unlocked in the app.</p>



<h2 class="wp-block-heading"><strong>The Balance Between Profit and User Experience (UX)</strong></h2>



<p>The biggest challenge with all these models is the fine line between maximizing revenue and annoying users. A poor user experience (UX) caused by overly aggressive monetization inevitably leads to the app being uninstalled quickly. For example, pop-up full-screen ads or poorly optimized video ads not only consume valuable data volume but can also cause annoying delays and longer loading times due to their size.</p>



<p>If you add too many ad interruptions, paywalls in inappropriate places, or a strong pay-to-win feeling, the trust of the user base is usually completely lost. A smart way out of this dilemma is often so-called Rewarded Video Ads. Here, the user decides for themselves whether they want to watch a commercial and receives an in-app reward as a thank you. To find out exactly where their own target audience&#8217;s pain threshold lies, experienced development teams also rely on A/B testing. This helps determine how many ads will be tolerated without people bouncing.</p>



<h2 class="wp-block-heading"><strong>Conclusion: &#8220;Free&#8221; Always Has a Price</strong></h2>



<p>At the end of the day, it becomes clear: no app is truly completely free. Even if we don&#8217;t pay a cent when downloading from the App Store, we indirectly co-finance the development and server costs. Be it through our attention to advertising, the purchase of virtual coins, or signing up for a premium subscription. The free-to-play and freemium models have prevailed because they lower the barrier to entry for us users to zero.</p>



<p>For development studios, however, it remains a constant balancing act. Only those who have a firm grip on the complex technology in the background and find a fair balance between monetization and a great user experience will survive on users&#8217; smartphones in the long run. Ultimately, the apps that win are the ones that offer real value without making us feel like walking wallets.</p>



<p>Sources:</p>



<p>Picture is generated with Gemini (Nanobanana)</p>



<p><a href="https://startup-creator.com/blog/app-monetarisierung">https://startup-creator.com/blog/app-monetarisierung</a></p>



<p><a href="https://www.publift.com/de/blog/app-monetization">https://www.publift.com/de/blog/app-monetization</a></p>



<p><a href="https://www.adpushup.com/de/blog/game-monetization-model">https://www.adpushup.com/de/blog/game-monetization-model</a></p>



<p><a href="https://www.devteam.space/blog/how-to-add-ads-to-your-app">https://www.devteam.space/blog/how-to-add-ads-to-your-app</a></p>



<p><a href="https://nirajpaul2.medium.com/storekit-2-0-part-1-dcacd1a1e861">https://nirajpaul2.medium.com/storekit-2-0-part-1-dcacd1a1e861</a></p>



<p><a href="https://developer.android.com/google/play/billing?hl=de">https://developer.android.com/google/play/billing?hl=de</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/freemium-subscriptions-and-ads-a-technical-and-economic-look-at-app-revenues/">Freemium, Subscriptions, and Ads: A Technical and Economic Look at App Revenues</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Projekt WS25 &#124; MixMatch (Fortsetzung)</title>
		<link>https://mobile.fhstp.ac.at/allgemein/projekt-ws25-mixmatch-fortsetzung/</link>
		
		<dc:creator><![CDATA[Andreas Kaiser]]></dc:creator>
		<pubDate>Sun, 01 Mar 2026 23:41:03 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Native Development]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Studium]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[mobile]]></category>
		<guid isPermaLink="false">https://mobile.fhstp.ac.at/?p=15368</guid>

					<description><![CDATA[<p>Um mein Projekt &#8220;MixMatch&#8221; näher in die Richtung production-ready Zustand zu bringen wurde das 3. Semester von mir genutzt, nahtlos an den zuvor vorhandenen Stand der Entwicklung anzuschließen.Im Semester habe ich mich im wesentlichen darauf fokussiert, Community Features, wie Sterne-Bewertungen und Kommentier- bzw. Antwortfunktion, in meine Nativescript-App zu integrieren und deutlich mehr Zeit in Bugfixing <a class="read-more" href="https://mobile.fhstp.ac.at/allgemein/projekt-ws25-mixmatch-fortsetzung/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/projekt-ws25-mixmatch-fortsetzung/">Projekt WS25 | MixMatch (Fortsetzung)</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Um mein Projekt &#8220;MixMatch&#8221; näher in die Richtung production-ready Zustand zu bringen wurde das 3. Semester von mir genutzt, nahtlos an den zuvor vorhandenen Stand der Entwicklung anzuschließen.<br>Im Semester habe ich mich im wesentlichen darauf fokussiert, Community Features, wie Sterne-Bewertungen und Kommentier- bzw. Antwortfunktion, in meine Nativescript-App zu integrieren und deutlich mehr Zeit in Bugfixing zu investieren. Nebenbei wurde stellenweise das Design weiter optimiert, sowie das Fehlerhandling überarbeitet. Zur Abrundung wurde im Projektabschnitt eine exportierbare Einkaufliste für Zutaten, die der/die User:in braucht, um die Rezepte nachzumachen, integriert.</p>



<h2 class="wp-block-heading"><strong>Neuerungen seit dem letzten Semester</strong></h2>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.34%">
<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="1224" height="2570" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/03/Screenshot_20260301_232048.png" alt="" class="wp-image-15782" style="width:232px;height:auto" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/03/Screenshot_20260301_232048.png 1224w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/03/Screenshot_20260301_232048-732x1536.png 732w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/03/Screenshot_20260301_232048-975x2048.png 975w" sizes="auto, (max-width: 1224px) 100vw, 1224px" /></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%">
<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="1224" height="2570" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/03/Screenshot_20260302_003203.png" alt="" class="wp-image-15787" style="width:231px;height:auto" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/03/Screenshot_20260302_003203.png 1224w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/03/Screenshot_20260302_003203-732x1536.png 732w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/03/Screenshot_20260302_003203-975x2048.png 975w" sizes="auto, (max-width: 1224px) 100vw, 1224px" /></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%">
<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="1224" height="2570" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/03/Screenshot_20260301_232236.png" alt="" class="wp-image-15784" style="width:234px;height:auto" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/03/Screenshot_20260301_232236.png 1224w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/03/Screenshot_20260301_232236-732x1536.png 732w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/03/Screenshot_20260301_232236-975x2048.png 975w" sizes="auto, (max-width: 1224px) 100vw, 1224px" /></figure>
</div>
</div>



<ul class="wp-block-list">
<li><strong>Filteroptionen in der Rezeptliste</strong></li>
</ul>



<p>Der größte strukturelle Umbau fand in der Rezeptliste statt. Bisher wurden die Rezepte einfach als rohe Liste angezeigt, ohne Möglichkeit zur Filterung. Jetzt gibt es eine eigene Suchleiste mit Autocomplete-Vorschlägen der gefilterten Drinks, eine alphabetische Sortierung mit Drink-Nummer pro Karte, sowie einen Toggle-Filter für Signature Drinks.</p>



<ul class="wp-block-list">
<li><strong>Kommentar-Sektion bei den Recipes</strong></li>
</ul>



<p>Das Herzstück des Projektes war die Erweiterung, dass jedes Rezept nun eine vollwertige Community-Section hat. User:innen können Kommentare mit Sternebewertung hinterlassen, auf Kommentare anderer antworten und eigene Kommentare wieder löschen. Die Bewertungen fließen in eine Durchschnittsbewertung ein, die prominent im Header der Rezeptkarte angezeigt wird. Die gesamte Kommunikation läuft in Echtzeit über WebSockets.</p>



<ul class="wp-block-list">
<li><strong>Benötigte Zutaten einer Einkaufsliste hinzufügen</strong></li>
</ul>



<p>Bisher wurden alle nicht angegebenen Zutaten bei der Hauptsuche automatisch gesammelt und global in meinem Code zwischengespeichert. Das wurde grundlegend über ein Einkaufslisten-Feature überarbeitet: Pro Rezept kann der/die Nutzer:in nun selbst entscheiden, ob er/sie die fehlenden Zutaten zur Einkaufsliste hinzufügen möchte. Fehlende Zutaten werden in der Zutatenliste farblich in Orange hervorgehoben. Ein einzelner Button pro Rezept überträgt dann gezielt nur die fehlenden Zutaten in die Einkaufsliste. Die Einkaufsliste selbst unterstützt den Export als PDF über den nativen Android PrintManager sowie im CSV-Format.<br><br>Neben diesen Änderungen konnten viele Bugs behoben werden. Speziell einige Bugs, die die Funktionalität rund um die Erstellung von &#8220;Signature Drinks&#8221; (anlegen/löschen) als auch den Umgang mit gekennzeichneten Favoriten-Rezepten, eingeschränkt haben, existieren nicht mehr.</p>



<h2 class="wp-block-heading"><strong>Technischer Part</strong></h2>



<p>Der Großteil an Technologien ist gleich geblieben. Im Frontend setze ich weiterhin auf NativeScript Angular bzw. Tailwind für das Design und im Backend SpringBoot. Das Backend habe ich dieses Semester erstmalig über den Online-Service Railway gehostet. Dazugekommen sind vor allem die WebSocket-Bibliothek <code>@stomp/stompjs</code> im Frontend sowie die entsprechende Spring WebSocket-Abhängigkeit im Backend.</p>



<p>Für die Kommentar-Funktion war von Anfang an klar, dass klassische HTTP-Requests nicht ausreichen , sonst wäre ein ständiges manuelles Aktualisieren notwendig gewesen, um neue Kommentare zu sehen. Die Wahl fiel auf WebSockets mit STOMP, einem einfachen Messaging-Protokoll das auf WebSocket aufsetzt und ein Publish-Subscribe-Modell ermöglicht. Im Spring Boot Backend wird dabei ein Message-Broker konfiguriert der eingehende Nachrichten an alle Subscriber des jeweiligen Rezept-Topics weiterleitet. Jedes Rezept hat seinen eigenen Kanal, zum Beispiel <code>/topic/recipe/42/comments</code>. Nur Nutzer:innen die gerade dieses Rezept offen haben, empfangen die Kommentar, die zu diesem Rezept abgegeben wurden. Der Controller nimmt neue Kommentare entgegen, speichert sie und schickt sie sofort an alle aktiven Subscriber:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
@MessageMapping(&quot;/comments/create&quot;)
public void createComment(CreateCommentRequestDto request, Principal principal) {
    User author = userRepository.findByUsername(principal.getName())...;
    CommentResponseDto saved = commentService.createComment(request, author);
    messagingTemplate.convertAndSend(
        &quot;/topic/recipe/&quot; + request.getRecipeId() + &quot;/comments&quot;, 
        saved
    );
}
</pre></div>


<p>Im Frontend übernimmt ein dedizierter <code>CommentWebSocketService</code> die gesamte Verbindungslogik. Er verwendet die <code>@stomp/stompjs</code> Bibliothek, schickt den JWT-Token beim Verbindungsaufbau mit und subscribt auf den zum Rezept passenden Topic-Kanal:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
this.stompClient = new Client({
    webSocketFactory: () =&gt; new WebSocket(`wss://...railway.app/ws`),
    connectHeaders: { Authorization: `Bearer ${this.authToken}` },
    reconnectDelay: 5000,
});

this.stompClient.onConnect = () =&gt; {
    this.stompClient.subscribe(
        `/topic/recipe/${this.recipeId}/comments`,
        (message) =&gt; {
            const comment = JSON.parse(message.body);
            onCommentReceived(comment);
        }
    );
};
</pre></div>


<h2 class="wp-block-heading"><strong>Herausforderungen &amp; Learning(s) daraus</strong></h2>



<p>Die größte Herausforderung des Semesters waren eindeutig die WebSockets. Theoretisch klingt es simpel (Verbindung öffnen und Nachrichten empfangen), jedoch in der Praxis gab es einige Hürden. Zuerst die Authentifizierung: anders als bei normalen HTTP-Requests musste der JWT-Token über die STOMP <code>connectHeaders</code> mitgeschickt und im Backend extra validiert werden. Dann das Problem mit inaktiven Verbindungen, denn ohne der sogenannten &#8220;Heartbeat-Konfiguration&#8221; auf beiden Seiten kamen Nachrichten irgendwann einfach nicht mehr an (Fehlermeldungen wurden nicht geworfen). Zu guter Letzt das Aufräumen der Verbindungen, denn ohne explizites <code>disconnect()</code> blieben im Hintergrund immer mehr aktive Verbindungen offen.</p>



<p>Was das Aufräumen so schwierig gemacht hat, war der Pager, mit dem man zwischen den Rezepten swipen kann. NativeScript&#8217;s Pager-Komponente erstellt alle Rezept-Items gleichzeitig beim Laden, bei 14 Rezepten also sofort 14 WebSocket-Verbindungen und 14 HTTP-Requests, obwohl der/die Nutzer:in nur ein einziges Rezept sieht. Noch dazu wird <code>ngOnDestroy</code> beim Wischen zwischen den Items nicht zuverlässig aufgerufen, weil der Pager seine Views intern recycelt statt sie wirklich zu zerstören. Dadurch hat die Cleanup-Logik nie gefeuert.</p>



<p>Die Lösung war letztlich ein Umdenken: statt auf <code>ngOnDestroy</code> zu vertrauen, steuert jetzt ein Flag, ob die Kommentar-Sektion überhaupt gerendert wird. Sobald der Nutzer wegwischt, verschwindet die Komponente via <code>*ngIf</code> aus dem DOM, damit das Cleanup zuverlässig durchläuft. Das wesentliche Learning dabei, war ein gut ausgebautes Debugging zu haben.</p>



<h2 class="wp-block-heading"><strong>Fazit und zukünftige TODOs</strong></h2>



<p>In diesem Projektabschnitt konnte ich mich erstmalig herausfordernd damit befassen, wie WebSockets technisch umgesetzt werden. Das war gleichzeitig eines der interessantesten und aufwändigsten Themen des Semesters. Die vielen Debugging-Sessions haben mich aber auch am meisten weitergebracht. Rückblickend bin ich sehr zufrieden damit, was ich mir vorgenommen hatte auch tatsächlich vollständig umgesetzt zu haben. Gerade das Bugfixing war diesmal besonders aufwändig, hat aber mit großem Erfolg geendet und manche Features meiner App brauchbarer gemacht.</p>



<p>An diesen Dingen sollte nun weitergearbeitet werden: Performance-seitig gibt es noch Luft nach oben, sowohl beim initialen Laden als auch bei den Screen-Wechseln merkt man stellenweise noch Verzögerungen die es zu optimieren gilt. Auch das Design ist noch nicht wirklich durchgängig einheitlich, was ich in einem nächsten Schritt konsequenter angehen möchte. Dazu kommt, dass ich bisher kaum echtes User-Feedback eingeholt habe, das soll sich ändern. Auf technischer Seite fehlen noch automatisierte Tests, die zur noch besseren Stabilität der App beitragen sollen. Schlussendlich wäre das große Ziel die App veröffentlichen zu können.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p><strong>Beitragsbild</strong>: dieses wurde mittels Einsatz von KI erzeugt</p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/projekt-ws25-mixmatch-fortsetzung/">Projekt WS25 | MixMatch (Fortsetzung)</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Projekt &#124; VS Code Extension</title>
		<link>https://mobile.fhstp.ac.at/studium/studium-projekte/projekt-vs-code-extension/</link>
		
		<dc:creator><![CDATA[Katharina Wurm]]></dc:creator>
		<pubDate>Thu, 26 Feb 2026 11:32:36 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Studium]]></category>
		<category><![CDATA[extension]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Typescript]]></category>
		<category><![CDATA[Visual Studio Code]]></category>
		<guid isPermaLink="false">https://mobile.fhstp.ac.at/?p=15534</guid>

					<description><![CDATA[<p>IDEs wie Visual Studio Code gehören zum Alltag jeder Softwareentwicklerin und jedes Softwareentwicklers – egal ob im Mobile-, Web- oder Backend-Bereich. Was VS Code besonders spannend macht, ist, dass es sich erweitern lässt. Sogenannte &#8220;Extensions&#8221; ermöglichen es, die Arbeitsumgebung individuell zu gestalten, Prozesse zu automatisieren und neue Funktionen direkt in den Editor zu integrieren. Obwohl <a class="read-more" href="https://mobile.fhstp.ac.at/studium/studium-projekte/projekt-vs-code-extension/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/studium/studium-projekte/projekt-vs-code-extension/">Projekt | VS Code Extension</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p><span style="font-size: revert; white-space: normal;">IDEs wie Visual Studio Code gehören zum Alltag jeder Softwareentwicklerin und jedes Softwareentwicklers – egal ob im Mobile-, Web- oder Backend-Bereich. </span>Was VS Code besonders spannend macht, ist, dass es sich erweitern lässt. Sogenannte &#8220;Extensions&#8221; ermöglichen es, die Arbeitsumgebung individuell zu gestalten, Prozesse zu automatisieren und neue Funktionen direkt in den Editor zu integrieren.</p>



<p>Obwohl ich bereits unzählige Stunden in IDEs wie VS Code verbracht habe, um Apps und mehr zu entwickeln, hatte ich mich bisher nie damit beschäftigt, wie sich die Entwicklungsumgebung selbst erweitern lässt.</p>



<p>Da ich die Idee hatte, in meiner Masterarbeit eine VS Code Extension zu entwickeln, wollte ich das Einzelprojekt im 3. Semester der Masterklasse Mobile nutzen, um erste praktische Erfahrungen mit der Entwicklung von VS Code Extensions zu sammeln, bevor ich mich an die separate Entwicklung des Masterarbeitsprojekts mache.</p>



<p>Das Ergebnis dieses explorativen Projekts ist &#8220;Cute Cat&#8221;: eine süße VS Code Extension, die unterschiedliche Möglichkeiten von VS Code Extensions kombiniert.</p>



<h2 class="wp-block-heading">Features</h2>



<h3 class="wp-block-heading">Commands</h3>



<p>Die Extension stellt mehrere Commands zur Verfügung, die direkt über die Command Palette in VS Code aufgerufen werden können:</p>



<ul class="wp-block-list">
<li><strong>&#8220;Meow!&#8221;</strong> zeigt eine kurze Informationsnachricht.</li>



<li>&#8220;<strong>Show me the cat“</strong>&nbsp;öffnet ein Informations-Popup, in welchem auch mehrzeiliger Text verwendet werden kann.</li>



<li>&#8220;<strong>Wake up cat“</strong>&nbsp;aktiviert die WebView im Side Panel (falls sie nicht schon angezeigt wird) und zeigt eine überraschte Katze für ein paar Sekunden. Die WebView wird weiter unten im Detail beschrieben.</li>



<li>&#8220;<strong>Wrap selection in try catch block“</strong>&nbsp;erweitert den ausgewählten Code automatisch um einen&nbsp;try-catch-Block oder gibt eine Warnung aus, falls keine Auswahl getroffen wurde.</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="1255" height="652" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/commands.png" alt="" class="wp-image-15614" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/commands.png 1255w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/commands-770x400.png 770w" sizes="auto, (max-width: 1255px) 100vw, 1255px" /></figure></div>


<h3 class="wp-block-heading">Themes</h3>



<p>Neben funktionalen Features wurden auch eigene Designkomponenten umgesetzt:</p>



<ul class="wp-block-list">
<li><strong>&#8220;Cute Cat Pastel Dark&#8221;</strong> Colour Theme</li>



<li><strong>&#8220;Cute Cat Pastel Icons&#8221;</strong> Icon Theme</li>
</ul>



<p>Dabei lag der Fokus auf einer konsistenten visuellen Identität. Die Kombination aus sanften Pastelltönen und angepassten Icons verleiht der Extension einen klaren Wiedererkennungswert.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1255" height="652" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/theme-demo-2.jpg" alt="" class="wp-image-15612" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/theme-demo-2.jpg 1255w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/theme-demo-2-770x400.jpg 770w" sizes="auto, (max-width: 1255px) 100vw, 1255px" /></figure>



<h3 class="wp-block-heading"><strong>WebView Side Panel</strong></h3>



<p>Ein zentrales Element der Extension ist die WebView im Side Panel. Dort wird ein animiertes Katzen-GIF angezeigt, das dynamisch auf Kontextinformationen reagiert:</p>



<ul class="wp-block-list">
<li>Anpassung an die Tageszeit (z. B. „Good Morning“)</li>



<li>Reaktion auf lange Coding-Sessions (z. B. schlägt die Katze dem*der User*in nach 4 Stunden vor, eine Kaffeepause einzulegen)</li>



<li>Anzeige der aktuellen Session-Dauer</li>



<li>Anzeige, wie lange die Extension insgesamt schon aktiv ist (&#8220;<em>Did you know we have been friends for 19h 58min?</em>&#8220;)</li>
</ul>



<p>Zusätzlich kann innerhalb der WebView über ein Settings-Icon ein Modal geöffnet werden, in dem User*innen mit einem Klick die bereitgestellte Colour bzw. Icon Theme (de)aktivieren können.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1255" height="652" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/webview.png" alt="" class="wp-image-15616" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/webview.png 1255w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/webview-770x400.png 770w" sizes="auto, (max-width: 1255px) 100vw, 1255px" /></figure>



<h3 class="wp-block-heading">Text Decorations</h3>



<p>Ein weiteres Feature der Extension sind dynamische Text Decorations. In den geöffneten Texteditoren werden Schlüsselwörter wie &#8220;cat&#8221; und &#8220;cute&#8221; mit kleinen dekorativen Elementen versehen.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1255" height="652" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/decorations.png" alt="" class="wp-image-15618" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/decorations.png 1255w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/decorations-770x400.png 770w" sizes="auto, (max-width: 1255px) 100vw, 1255px" /></figure>



<details class="wp-block-details is-layout-flow wp-block-details-is-layout-flow"><summary><em>Attribution</em></summary>
<ul class="wp-block-list">
<li><em>Cat&nbsp;SVG Vector (mit geänderter Farbe): bereitgestellt auf <a href="https://www.svgrepo.com/svg/522779/cat">https://www.svgrepo.com/svg/522779/cat</a> von <a href="https://www.svgrepo.com/author/Solar%20Icons/">Solar Icons</a> unter der <a href="https://www.svgrepo.com/page/licensing/#CC%20Attribution">CC Attribution Lizenz</a></em></li>



<li><em>Bow Tie Ribbon&nbsp;SVG Vector (mit geänderter Farbe): bereitgestellt auf <a href="https://www.svgrepo.com/svg/321894/bow-tie-ribbon">https://www.svgrepo.com/svg/321894/bow-tie-ribbon</a> von <a href="https://www.svgrepo.com/collection/game-interface-icons/">Game Interface Icons</a> unter der <a href="https://www.svgrepo.com/page/licensing/#CC%20Attribution">CC Attribution Lizenz</a></em></li>
</ul>
</details>



<h2 class="wp-block-heading">Projektaufbau</h2>



<p>Vereinfacht dargestellt ist das Projekt wie folgt aufgebaut:</p>



<pre class="wp-block-code"><code>- media/
  - webViewScript.js
  - webViewStyles.css
  - &#91;...Bilder]
- src/
  - extension.ts (Einstiegspunkt)
  - &#91;...]
- themes/
  - color-theme.json
  - icon-theme.json
- &#91;...]
- package.json (Manifest)</code></pre>



<p>Wichtig sind hierbei die <code>package.json</code> Datei, in welcher die Commands, WebView und Themes deklariert werden, und die <code>src/extension.ts</code> Datei, welche den Einstiegspunkt der Extension darstellt:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
import * as vscode from &#039;vscode&#039;;

export function activate(context: vscode.ExtensionContext) {
    // ...
}

export function deactivate() {}
</pre></div>


<h2 class="wp-block-heading">Challenges und Learnings</h2>



<h3 class="wp-block-heading">API-Dokumentation</h3>



<p>VS Code bietet einen <a href="https://code.visualstudio.com/api/get-started/your-first-extension">&#8220;Your First Extension&#8221; Guide</a> und stellt viele Beispielprojekte zu unterschiedlichen Extension-Funktionalitäten für Entwickler*innen zur Verfügung. Trotzdem ist es manchmal nicht so leicht, das genaue Beispielprojekt, welches man sucht, zu finden. Ich würde zukünftigen Extension-Developer*innen empfehlen, direkt auf GitHub zu schauen (<a href="https://github.com/microsoft/vscode-extension-samples">https://github.com/microsoft/vscode-extension-samples</a>), anstatt nur in der <a href="https://code.visualstudio.com/api">VS Code Extension API</a> zu suchen.</p>



<p>Falls man etwas Bestimmtes zur <a href="https://code.visualstudio.com/api/references/vscode-api">VS Code API</a> nachschauen will, ist diese recht gut dokumentiert. Leider funktionieren einige Links auf der Website allerdings nicht, weshalb ich mich hauptsächlich mit der Suchfunktion (STRG+F) durch die API-Dokumentation arbeiten musste.</p>



<p>Von der Community gibt es eher weniger Tutorials und Online-Beiträge. Um die VS Code Extension zu entwickeln, kombinierte ich daher Informationen aus der API-Dokumentation, aus Beispielprojekten und Tutorials und erarbeitete mir die fehlenden Details eigenständig durch &#8220;Learning by Doing&#8221;.</p>



<h3 class="wp-block-heading">Text Decoration Icons</h3>



<p>Man würde denken, ein Bild als Text Decoration zu setzen, wäre trivial. Doch hat es mich einige Zeit gekostet, bis ich Folgendes realisiert habe: Wenn man ein SVG Icon verwenden will, darf dieses nicht selbst &#8220;width&#8221; und &#8220;height&#8221; angeben. Obwohl man der Text Decoration sowohl width, als auch height, mitgeben kann, werden diese Angaben ignoriert, wenn das SVG seine eigene Größe vorgibt. </p>



<p>Weiters werden die Icons nicht mitting in der Zeile positioniert (siehe das Bild der Text Decorations: die Icons sind etwas weiter oben positioniert als der Text). Man kann der Decoration zwar auch einen Margin mitgeben, allerdings würde z. B. ein Top-Margin (um den extra Platz unterhalb des Icons auszugleichen) nicht nur das Icon, sondern die ganze Zeile nach unten schieben.</p>



<h3 class="wp-block-heading">Kommunikation zwischen Extension und WebView</h3>



<p>Eine weitere Challenge war die Kommunikation zwischen der Extension und der WebView, um insbesondere bei den &#8220;Theme Toggles&#8221; beide Seiten am gleichen Stand zu halten (wenn das Theme (extern) aktiviert wurde, sollte auch der Toggle in der WebView automatisch aktiviert werden). Dank der VS Code API können aber Nachrichten recht einfach zwischen der Extension und der WebView ausgetauscht werden.</p>



<h3 class="wp-block-heading">Debugging</h3>



<p>Ich fand es sehr spannend, insbesondere die WebView zu debuggen. Über die Command Palette in VS Code lässt sich der Web Inspector öffnen (&#8220;Toggle Developer Tools&#8221;), mit welcher sowohl der Console-Output, als auch die HTML-Elemente der ganzen IDE inspiziert werden können. Innerhalb von den Sourcefiles (abgesehen von <code>webViewScript.js</code>) lassen sich allerdings auch Breakpoints setzen.</p>



<p>Obwohl der sogenannte &#8220;Extension Development Host&#8221; (das separate VS Code Fenster, in welchem die Extension während der Entwicklung läuft) viel zu bieten hat, konnte ich nicht die komplette Funktionalität meiner Extension darin testen. Das Icon Theme lässt sich innerhalb des Extension Hosts zum Beispiel nicht programmatisch für den Workspace setzen (innerhalb von <code>.vscode/settings.json</code>), weshalb ich die Extension mit dem &#8220;<code>vsce package</code>&#8221; Command zuerst builden und installieren musste, um den &#8220;Icon Theme Toggle&#8221; innerhalb der WebView zu testen.</p>



<h2 class="wp-block-heading">Conclusion</h2>



<p>Mit dem Projekt &#8220;Cute Cat&#8221; konnte ich einen intensiven Einblick in die Möglichkeiten und Herausforderungen von VS Code Extensions gewinnen. Besonders wertvoll war für mich dabei der explorative Charakter des Projekts: Ich konnte vieles ausprobieren und dadurch ein tiefes Verständnis für die Entwicklung von VS Code Extensions aufbauen.</p>



<p>Ich bin stolz auf das, was ich erreicht habe, und fühle mich nun bestens vorbereitet, das nächste Projekt anzugehen: die Entwicklung meiner eigenen VS Code Extension im Rahmen der Masterarbeit.</p>
<p>The post <a href="https://mobile.fhstp.ac.at/studium/studium-projekte/projekt-vs-code-extension/">Projekt | VS Code Extension</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Projekt &#124; Timelapse Android App</title>
		<link>https://mobile.fhstp.ac.at/studium/studium-projekte/projekt-timelapse-android-app/</link>
		
		<dc:creator><![CDATA[David Grünberger]]></dc:creator>
		<pubDate>Thu, 26 Feb 2026 10:19:46 +0000</pubDate>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Dokumentation]]></category>
		<category><![CDATA[Native Development]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Studium]]></category>
		<category><![CDATA[Trends]]></category>
		<category><![CDATA[User Experience]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[design systems]]></category>
		<category><![CDATA[Jetpack Compose]]></category>
		<category><![CDATA[Material Design]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[Semesterprojekt]]></category>
		<guid isPermaLink="false">https://mobile.fhstp.ac.at/?p=15691</guid>

					<description><![CDATA[<p>Im Rahmen des Semesterprojekts im 3. Semester der Masterklasse Mobile habe ich die Android-App &#8220;Timelapse&#8221; entwickelt. Die Idee dahinter: Aus vielen einzelnen Momentaufnahmen wird automatisch ein visueller Zeitstrahl – als Video, das langfristige Veränderungen sichtbar macht. Egal ob Bartwachstum, Fitness-Progress oder das Wachstum einer Zimmerpflanze: Timelapse hilft dabei, diese Reise festzuhalten. Ziel des Projekts war ein alltagstauglicher MVP, der den kompletten Ablauf abdeckt: vom Erstellen <a class="read-more" href="https://mobile.fhstp.ac.at/studium/studium-projekte/projekt-timelapse-android-app/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/studium/studium-projekte/projekt-timelapse-android-app/">Projekt | Timelapse Android App</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Im Rahmen des Semesterprojekts im 3. Semester der Masterklasse Mobile habe ich die Android-App &#8220;Timelapse&#8221; entwickelt. Die Idee dahinter: Aus vielen einzelnen Momentaufnahmen wird automatisch ein visueller Zeitstrahl – als Video, das langfristige Veränderungen sichtbar macht. Egal ob Bartwachstum, Fitness-Progress oder das Wachstum einer Zimmerpflanze: Timelapse hilft dabei, diese Reise festzuhalten. Ziel des Projekts war ein alltagstauglicher MVP, der den kompletten Ablauf abdeckt: vom Erstellen eines Projekts über tägliche Erinnerungen und eine übersichtliche Tage-Ansicht bis hin zur fertigen Video-Montage, die sich teilen oder archivieren lässt.</p>



<h2 class="wp-block-heading">Worum es in der&nbsp;App geht</h2>



<p>Im Kern funktioniert Timelapse wie ein&nbsp;visuelles&nbsp;Tagebuch:</p>



<ul class="wp-block-list">
<li>Nutzer:innen legen Projekte an (z. B. „Daily Selfie“ oder „Zimmerpflanze“).</li>



<li>Die App erinnert regelmäßig daran, neue Fotos aufzunehmen.</li>



<li>Alle Bilder werden zeitlich geordnet, mit Datum und optionalen Kommentaren gespeichert.</li>



<li>Auf einer kompakten Übersicht sieht man, wann man etwas aufgenommen hat, welche Tage besonders wichtig waren und wie sich das Projekt über Wochen und Monate entwickelt.</li>



<li>Aus dieser Sammlung erzeugt Timelapse auf Knopfdruck ein Zeitraffervideo, das die Geschichte des Projekts in wenigen Sekunden erzählt.</li>
</ul>



<h2 class="wp-block-heading">Zentrale&nbsp;Funktionen&nbsp;in&nbsp;Kürze</h2>



<ul class="wp-block-list">
<li><strong>Projektorganisation:</strong> Mehrere parallele Timelapse-Projekte mit Titel, Beschreibung und individuellen Einstellungen.</li>



<li><strong>Visuelle Timeline:</strong> Eine kombinierte Wochen- und Listenansicht zeigt, welche Tage schon dokumentiert sind und welche Lücken es noch gibt.</li>



<li><strong>Erinnerungen:</strong> Konfigurierbare Benachrichtigungen, damit die tägliche Aufnahme zur Routine wird und die Timeline nicht abreißt.</li>



<li>F<strong>avoriten &amp; Notizen:</strong> Einzelne Tage können hervorgehoben und mit kurzen Kommentaren versehen werden – etwa um Meilensteine oder besondere Momente zu markieren.</li>



<li><strong>Automatische Video-Montage:</strong> Die App erstellt aus den Bildern ein Video, berücksichtigt Ausrichtung, Datum, optionales Wasserzeichen und Kommentare und bietet Konfigurationsmöglichkeiten für Qualität oder Textstil.</li>
</ul>



<figure class="wp-block-gallery has-nested-images columns-4 wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1080" height="2400" data-id="15763" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260226_122653_Timelapse.jpg" alt="" class="wp-image-15763" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260226_122653_Timelapse.jpg 1080w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260226_122653_Timelapse-691x1536.jpg 691w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260226_122653_Timelapse-922x2048.jpg 922w" sizes="auto, (max-width: 1080px) 100vw, 1080px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1080" height="2400" data-id="15765" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260226_122559_Timelapse.jpg" alt="" class="wp-image-15765" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260226_122559_Timelapse.jpg 1080w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260226_122559_Timelapse-691x1536.jpg 691w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260226_122559_Timelapse-922x2048.jpg 922w" sizes="auto, (max-width: 1080px) 100vw, 1080px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1080" height="2400" data-id="15764" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260226_122619_Timelapse.jpg" alt="" class="wp-image-15764" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260226_122619_Timelapse.jpg 1080w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260226_122619_Timelapse-691x1536.jpg 691w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260226_122619_Timelapse-922x2048.jpg 922w" sizes="auto, (max-width: 1080px) 100vw, 1080px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1080" height="2400" data-id="15766" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260226_122700_Timelapse.jpg" alt="" class="wp-image-15766" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260226_122700_Timelapse.jpg 1080w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260226_122700_Timelapse-691x1536.jpg 691w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260226_122700_Timelapse-922x2048.jpg 922w" sizes="auto, (max-width: 1080px) 100vw, 1080px" /></figure>
<figcaption class="blocks-gallery-caption wp-element-caption"><strong>Abb. 1: App Screenshots</strong></figcaption></figure>



<h2 class="wp-block-heading">Technologie-Stack</h2>



<p>Die&nbsp;App ist&nbsp;als&nbsp;native&nbsp;Android-Anwendung mit Jetpack Compose&nbsp;umgesetzt und&nbsp;nutzt&nbsp;moderne&nbsp;Android-APIs sowie eine&nbsp;klare&nbsp;Schichtung&nbsp;zwischen&nbsp;UI, Logik&nbsp;und Medienverarbeitung.</p>



<ul class="wp-block-list">
<li><strong>UI: Jetpack Compose + Material 3</strong>
<ul class="wp-block-list">
<li>Alle Screens (Projektliste, Details, Dialoge, Konfiguration) sind vollständig in Compose realisiert.</li>



<li>Material-3-Komponenten wie LargeFlexibleTopAppBar, Listen, Cards und Dialoge sorgen für ein konsistentes Look &amp; Feel.</li>



<li>Ein zentrales TimelapseTheme verwaltet App-Theme (Light/Dark), Seed-Farbe und den Palette-Stil.</li>
</ul>
</li>



<li><strong>Material 3 Expressive &amp; Material You</strong>
<ul class="wp-block-list">
<li>Die App nutzt Material 3 Expressive, um eine lebendige, charakterstarke Farb- und Typografie-Sprache umzusetzen – passend zu einer App, die persönliche Veränderungen dokumentiert.</li>



<li>Über einen integrierten Color Picker wählen Nutzer:innen eine eigene Akzentfarbe.</li>



<li>Aus dieser Seed-Farbe wird mit Material You ein komplettes Farbschema generiert, das sich konsistent über die gesamte App zieht.</li>



<li>Dadurch wirkt Timelapse auf jedem Gerät persönlich, bleibt aber immer klar strukturiert und gut lesbar – unabhängig davon, ob Light- oder Dark-Mode aktiv ist.</li>
</ul>
</li>



<li><strong>Video-Montage &amp; Bildverarbeitung</strong>
<ul class="wp-block-list">
<li>Die Montage-Logik läuft in einem eigenen Modul:</li>



<li>Bilder werden anhand ihrer EXIF-Daten korrekt ausgerichtet.</li>



<li>Ein Canvas setzt die Frames zusammen, ergänzt Texte (Datum, Kommentare, Wasserzeichen) und kümmert sich um Hintergrundfarbe und Zensurflächen.</li>



<li>Ein Muxer erzeugt daraus ein MP4-Video, gesteuert über Kotlin Flows, die den Fortschritt an die UI melden.</li>



<li>So entsteht aus einer losen Sammlung von Bildern ein stimmiges Timelapse-Video, ohne dass externe Tools nötig sind.</li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading">Material&nbsp;3 Expressive&nbsp;&amp; Material You im&nbsp;Einsatz</h2>



<p>Ein großer&nbsp;Fokus&nbsp;des&nbsp;Projekts lag&nbsp;auf einer&nbsp;modernen, adaptiven&nbsp;UI, die sich&nbsp;nach&nbsp;den&nbsp;Nutzer:innen richtet:</p>



<ul class="wp-block-list">
<li><strong>Dynamische Farbwelten</strong>
<ul class="wp-block-list">
<li>Durch den Seed-Color-Ansatz wirkt die App nicht wie ein statisch durchgestyltes Produkt, sondern wie ein Rahmen, der sich der jeweiligen Geschichte anpasst.</li>



<li>Projekte mit emotionalem Kontext (z. B. Schwangerschaft, Beziehungen, erste Wohnung) profitieren von den kräftigen, expressiven Paletten, die Material 3 bereitstellt.</li>
</ul>
</li>



<li><strong>Einheitliche, weiche Formsprache</strong>
<ul class="wp-block-list">
<li>Großzügige Rundungen (z. B. extra große Card-Shapes in Dialogen), expressive Typografie und bewusst eingesetzte Icons unterstützen den Tagebuch-Charakter der App.</li>



<li>Die App verzichtet auf überladene UI-Elemente und setzt auf Ruhe, Klarheit und Fokus – wichtig, wenn man sich über Monate immer wieder mit derselben Oberfläche beschäftigt.</li>
</ul>
</li>



<li><strong>Konsistentes Theming</strong>
<ul class="wp-block-list">
<li>Alle Bausteine – von Erfassungsdialogs über Erinnerungs-Settings bis hin zu Fortschrittsanzeigen bei Scans und Montage – hängen am gleichen Theme.</li>



<li>Änderungen an Theme, Palette oder Seed-Farbe greifen sofort durch, ohne dass einzelne Screens speziell angepasst werden müssen.</li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading">Herausforderungen&nbsp;&amp; Learnings</h2>



<ul class="wp-block-list">
<li><strong>Balance zwischen Einfachheit und Kontrolle</strong>
<ul class="wp-block-list">
<li>Nutzer:innen sollen einerseits „einfach nur“ ein Timelapse-Video erstellen können, andererseits genug Einstellmöglichkeiten für Qualität, Text, Stabilisierung und Privatsphäre haben.</li>



<li>Ein wichtiger Lernpunkt war, die Komplexität hinter klaren Dialogen und wenigen, gut erklärten Optionen zu verstecken.</li>
</ul>
</li>



<li><strong>Stabile, angenehme Timelapse-Videos</strong>
<ul class="wp-block-list">
<li>Kleine Fehler bei Skalierung oder Matrix-Transformation führen schnell zu Sprüngen oder abgeschnittenen Bereichen – hier war viel Feintuning nötig.</li>
</ul>
</li>



<li><strong>Durchgängiges Theming mit Material 3 / Material You</strong>
<ul class="wp-block-list">
<li>Seed-Farben, dynamische Paletten und unterschiedliche Palettenstile (z. B. Expressive) lassen sich mächtig kombinieren – aber nur, wenn das Theming-Konzept von Anfang an klar definiert ist.</li>



<li>Die wichtigste Erkenntnis: Ein zentrales Theme-Objekt vereinfacht langfristig alle Entscheidungen rund um Farben, Typografie und Component-Styling.</li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading">Fazit</h2>



<p>Timelapse war für mich ein Projekt, in dem sich User Experience, modernes Android-Design und Medienverarbeitung sehr gut ergänzt haben. Die App zeigt, wie sich mit Jetpack Compose, Material 3 Expressive und Material You eine Oberfläche bauen lässt, die technisch anspruchsvolle Abläufe (zB. Videomontage) hinter einem einfachen, persönlichen Nutzungserlebnis versteckt. Besonders spannend war zu sehen, wie stark sich die Wahrnehmung der App ändert, wenn man eine eigene Farbwelt definieren kann und diese sich konsequent durch alle Screens zieht. In zukünftigen Schritten möchte ich die App um Themen wie Musik, Export-Presets und umfangreichere Sharing-Optionen erweitern – immer mit dem Ziel, den Kern beizubehalten: Veränderung sichtbar machen, ohne dass sich der Aufwand danach anfühlt.</p>
<p>The post <a href="https://mobile.fhstp.ac.at/studium/studium-projekte/projekt-timelapse-android-app/">Projekt | Timelapse Android App</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Projekt &#124; MusicGuesser</title>
		<link>https://mobile.fhstp.ac.at/allgemein/projekt-musicguesser/</link>
		
		<dc:creator><![CDATA[Sebastian Zettl]]></dc:creator>
		<pubDate>Thu, 26 Feb 2026 08:51:28 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<guid isPermaLink="false">https://mobile.fhstp.ac.at/?p=15677</guid>

					<description><![CDATA[<p>Im dritten Semester ist es uns frei in der Mobile Masterklasse überlassen, wie wir neben dem Semesterprojekt auf unsere Punkte kommen wollen. Um auf die Punkte zu kommen, habe ich in diesem Semester, ein eigenes Kotlin Projekt gemacht. Diese ist ein MusicGuesser. Man kann aus lokalen MP3s Quizzen erstellen und dann in einem Quiz den <a class="read-more" href="https://mobile.fhstp.ac.at/allgemein/projekt-musicguesser/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/projekt-musicguesser/">Projekt | MusicGuesser</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Im dritten Semester ist es uns frei in der Mobile Masterklasse überlassen, wie wir neben dem Semesterprojekt auf unsere Punkte kommen wollen. Um auf die Punkte zu kommen, habe ich in diesem Semester, ein eigenes Kotlin Projekt gemacht. Diese ist ein MusicGuesser. Man kann aus lokalen MP3s Quizzen erstellen und dann in einem Quiz den Liedtitel aus einem kurzen Snippet des Liedes erraten</p>



<h2 class="wp-block-heading">Features</h2>



<h3 class="wp-block-heading">Quiz erstellen</h3>



<p>Beim Start der App kann man einen Order mit lokaler Musik aussuchen. Danach landet man am Hauptscreen. Mithilfe des FloatinACtionButtons kann man ein neues Quiz erstellen. Diesem kann man einen Namen geben und per ausgewählter Suchbegriffe die Liedtitel aussuchen und dem Quiz hinzufügen. Danach kann man das Quiz in der Liste sehen, mit Information wie dem Namen, der Anzahl der Lieder und welchen Rang man in welchem Modus hat.</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1080" height="2400" data-id="15678" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260128_080004_MusicGuesser.jpg" alt="" class="wp-image-15678" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260128_080004_MusicGuesser.jpg 1080w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260128_080004_MusicGuesser-691x1536.jpg 691w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260128_080004_MusicGuesser-922x2048.jpg 922w" sizes="auto, (max-width: 1080px) 100vw, 1080px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1080" height="2400" data-id="15682" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260208_123540_MusicGuesser.jpg" alt="" class="wp-image-15682" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260208_123540_MusicGuesser.jpg 1080w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260208_123540_MusicGuesser-691x1536.jpg 691w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260208_123540_MusicGuesser-922x2048.jpg 922w" sizes="auto, (max-width: 1080px) 100vw, 1080px" /></figure>
</figure>



<h3 class="wp-block-heading">Quiz starten</h3>



<p>Wenn man auf ein Quiz drückt, dann kommt man auf den Start Screen des Quiz. Dort kann man den Modus auswählen, Random und Progression, zusammen mit der Schwierigkeit. Der Mode entscheidet, wie man die Lieder navigieren kann. Auf Random, kann man zwischen jedem Lied hin und her springen. Bei Progression, muss man das derzeitige Lied erraten bevor man weitergehen kann. Die Schwierigkeit gibt an, wie lange der Ausschnitt des Liedes ist, und mit höherer Schwierigkeit wird der Ausschnitt kürzer.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1080" height="2400" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260128_080015_MusicGuesser.jpg" alt="" class="wp-image-15679" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260128_080015_MusicGuesser.jpg 1080w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260128_080015_MusicGuesser-691x1536.jpg 691w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260128_080015_MusicGuesser-922x2048.jpg 922w" sizes="auto, (max-width: 1080px) 100vw, 1080px" /></figure>



<h3 class="wp-block-heading">Quiz spielen</h3>



<p>Beim Spielen hat man oben einmal den Player, mithilfe wessen man den Ausschnitt abspielen kann. Darunter hat man die Navigation, köpfe fürs vorwärts und rückwärts springen und im Random Gamemode auch Dot Indikators, auf welchem Lied man sich befindet und mithilfe dessen man auch navigieren kann. Wenn man fertig mit einem Lied ist, kommt man auf den result screen. Dort bekommt man eine Medaille, wenn man alle Lieder richtig hatte. Wenn man das Lied auf einer höheren Schwierigkeit schafft, dann bekommt man auch eine bessere Medaille. Zuletzt hat man auch eine Ansicht, was man bei welchem Lied geraten hat und ob es richtig war.</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-4 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1080" height="2400" data-id="15680" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260128_080039_MusicGuesser.jpg" alt="" class="wp-image-15680" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260128_080039_MusicGuesser.jpg 1080w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260128_080039_MusicGuesser-691x1536.jpg 691w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260128_080039_MusicGuesser-922x2048.jpg 922w" sizes="auto, (max-width: 1080px) 100vw, 1080px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1080" height="2400" data-id="15681" src="https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260128_080105_MusicGuesser.jpg" alt="" class="wp-image-15681" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260128_080105_MusicGuesser.jpg 1080w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260128_080105_MusicGuesser-691x1536.jpg 691w, https://mobile.fhstp.ac.at/wp-content/uploads/2026/02/Screenshot_20260128_080105_MusicGuesser-922x2048.jpg 922w" sizes="auto, (max-width: 1080px) 100vw, 1080px" /></figure>
</figure>



<h2 class="wp-block-heading">Technologien</h2>



<p>Die App wurde als eine native Android-App mithilfe von Kotlin entwickelt. Als UI Tool Kit wurde Jetpack compose verwendet. Manche der anderen verwendetetn Libnries wären:</p>



<ul class="wp-block-list">
<li>Room: Eine Persistenz Library, welche über einen Abstraktionen-Layer wie Entity und DAO Klassen mit einer SQLite Datenbank interagiert und managen.</li>



<li>Media3 ExoPlayer: Einer der Basis Mediaplayer auf Android und von Jetpack Compose. Erlaubt die Basisfunktionalitäten, wie abspielen, pausieren, etc.<br>Weiter kleiner Libraries welcher verwendet wurde, sind zum Beispiel Koin für die Dependency injection oder Compose Navigation.</li>
</ul>



<h2 class="wp-block-heading">Herausforderungen</h2>



<p>Die wahrscheinlich größte Herausforderung war die generelle Verwendung von Kotlin. Im zweiten Semester hatten wir zwar eine Einführung in Kotlin und auch für unser Semesterprojekt im dritten Semester haben wir Kotlin verwendeten. Aber eine ganze App alleine zu entwickeln war noch einmal etwas anderes und eine größere Herausforderung.</p>



<p>Eine andere Herausforderung war das Installieren der Libraries. Oft stand auf den Dokumentationsseiten nicht alle nötigen dependincies zum Installieren, oder sie waren über verschiedene Seiten aufgeteilt/stand etwas anderes. Auch standen sie oft noch in der alten Form auf den Seiten, wo die Versionen direkt im build gradle eingetragen wurde. Jetzt gibt es die neuere Version, die Version <code>libs.versions.otml</code> einzutragen und das dependency definieren im <code>build.gradle.kts</code> zu machen. Wenn man aber die generelle Struktur weiß, war dies ein geringeres Problem.</p>



<p>Ein anderes Problem war die Größe meiner Musik Bibliothek. Ich habe über 1000 lokale Lieder, welche die Optimierung des Durchsuchens wichtig gemacht hat. Nach etwas herumprobieren habe ich den MediaStore, welche automatisch einen Index aller Media Dateien am Handy besitzt, und der Zugriff und Abruf meiner Bibliothek in Sekunden vollziehen konnte</p>



<h2 class="wp-block-heading">Learnings und Nächste Schritte</h2>



<p>Ich habe einiges über die generelle Verwendung und Entwicklung mit Kotlin gelernt. Auch das von einer meiner Kollegen beigebrachte MVC Prinzips, anhand eines BaseViewModels mit Action, State und Effekt Klassen.</p>



<p>Es gibt einige Richtungen, wie dieses Projekt erweitert werden könnte, viele Ideen, welche von meinem Kollegen beim Herzeigen kamen. Zum Beispiel das Erstellen von Online quizzen, welche von anderen Personen gesehen werden könnten. Auch neue Spielmodi, wie das Hören von Song in reverse oder einen endlosen Modus kamen.</p>



<p>Images from me and banner image from: https://pixabay.com/vectors/vinyl-platinum-disk-music-dj-2241789/</p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/projekt-musicguesser/">Projekt | MusicGuesser</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
