<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>C# | Cayden's Portfolio</title><link>https://cayden2606.github.io/tags/c%23/</link><atom:link href="https://cayden2606.github.io/tags/c%23/index.xml" rel="self" type="application/rss+xml"/><description>C#</description><generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Tue, 12 Aug 2025 00:00:00 +0000</lastBuildDate><image><url>https://cayden2606.github.io/media/icon_hu4025619135640661267.png</url><title>C#</title><link>https://cayden2606.github.io/tags/c%23/</link></image><item><title>Vantage Hub</title><link>https://cayden2606.github.io/projects/uwp/</link><pubDate>Tue, 12 Aug 2025 00:00:00 +0000</pubDate><guid>https://cayden2606.github.io/projects/uwp/</guid><description>
&lt;details class="print:hidden xl:hidden" open>
&lt;summary>Table of Contents&lt;/summary>
&lt;div class="text-sm">
&lt;nav id="TableOfContents">
&lt;ul>
&lt;li>&lt;a href="#overview">&lt;strong>Overview&lt;/strong>&lt;/a>&lt;/li>
&lt;li>&lt;a href="#screenshots-">&lt;strong>Screenshots&lt;/strong> 📸&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#home-dashboard">Home Dashboard&lt;/a>&lt;/li>
&lt;li>&lt;a href="#alarm-management">Alarm Management&lt;/a>&lt;/li>
&lt;li>&lt;a href="#app-switcher">App Switcher&lt;/a>&lt;/li>
&lt;li>&lt;a href="#sketching--ai-chatbot">Sketching &amp;amp; AI Chatbot&lt;/a>&lt;/li>
&lt;li>&lt;a href="#media-hub---music-player">Media Hub - Music Player&lt;/a>&lt;/li>
&lt;li>&lt;a href="#media-hub---radio">Media Hub - Radio&lt;/a>&lt;/li>
&lt;li>&lt;a href="#media-hub---video-player">Media Hub - Video Player&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#problem">&lt;strong>Problem&lt;/strong>&lt;/a>&lt;/li>
&lt;li>&lt;a href="#key-features">&lt;strong>Key Features&lt;/strong>&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#-home-dashboard">&lt;strong>🏠 Home Dashboard&lt;/strong>&lt;/a>&lt;/li>
&lt;li>&lt;a href="#-alarm--stopwatch">&lt;strong>⏰ Alarm &amp;amp; Stopwatch&lt;/strong>&lt;/a>&lt;/li>
&lt;li>&lt;a href="#-media-hub">&lt;strong>🎵 Media Hub&lt;/strong>&lt;/a>&lt;/li>
&lt;li>&lt;a href="#-doodle--ai-chat">&lt;strong>🎨 Doodle + AI Chat&lt;/strong>&lt;/a>&lt;/li>
&lt;li>&lt;a href="#-app-switcher">&lt;strong>🔄 App Switcher&lt;/strong>&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#tech-stack">&lt;strong>Tech Stack&lt;/strong>&lt;/a>&lt;/li>
&lt;li>&lt;a href="#api-keys--services">&lt;strong>API Keys &amp;amp; Services&lt;/strong>&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#setting-up-api-keys">&lt;strong>Setting Up API Keys&lt;/strong>&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#my-role">&lt;strong>My Role&lt;/strong>&lt;/a>&lt;/li>
&lt;li>&lt;a href="#project-structure">&lt;strong>Project Structure&lt;/strong>&lt;/a>&lt;/li>
&lt;li>&lt;a href="#quick-start-user-controls">&lt;strong>Quick Start (User Controls)&lt;/strong>&lt;/a>&lt;/li>
&lt;li>&lt;a href="#permissions-required">&lt;strong>Permissions Required&lt;/strong>&lt;/a>&lt;/li>
&lt;li>&lt;a href="#outcome">&lt;strong>Outcome&lt;/strong>&lt;/a>&lt;/li>
&lt;/ul>
&lt;/nav>
&lt;/div>
&lt;/details>
&lt;a href="https://github.com/Cayden2606/Vantage-Hub" style="display:flex;align-items:center;gap:10px;" target="_blank" rel="noopener">
&lt;img src="https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png" alt="GitHub Logo" style="width:28px;height:28px;">
GitHub Repository
&lt;/a>
&lt;hr>
&lt;h2 id="overview">&lt;strong>Overview&lt;/strong>&lt;/h2>
&lt;p>&lt;strong>Vantage Hub&lt;/strong> is a multi-functional Windows UWP desktop application designed to serve as a personal smart hub. It combines essential daily utilities—weather forecasting, alarm management, media playback, AI-assisted chat, and digital sketching—into a unified, modern interface optimised for both touch and desktop interaction.&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>📚 Academic Project&lt;/strong>&lt;br>
This project was developed as part of &lt;strong>EGE350 - Application Development &amp;amp; Cloud Services&lt;/strong>.&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h2 id="screenshots-">&lt;strong>Screenshots&lt;/strong> 📸&lt;/h2>
&lt;h3 id="home-dashboard">Home Dashboard&lt;/h3>
&lt;img src="Media/MainPage.png" alt="Main Page" width="600">
&lt;h3 id="alarm-management">Alarm Management&lt;/h3>
&lt;img src="Media/Alarm.png" alt="Alarm" width="600">
&lt;h3 id="app-switcher">App Switcher&lt;/h3>
&lt;img src="Media/AppSwitcher.png" alt="App Switcher" width="600">
&lt;h3 id="sketching--ai-chatbot">Sketching &amp;amp; AI Chatbot&lt;/h3>
&lt;img src="Media/Doodle+AI.png" alt="Doodle + AI" width="600">
&lt;h3 id="media-hub---music-player">Media Hub - Music Player&lt;/h3>
&lt;p>
&lt;img src="Media/MediaHub-Music.png" alt="Music" width="600">
&lt;img src="Media/MediaHub-Music-Expand.png" alt="Music Expanded" width="600">
&lt;/p>
&lt;h3 id="media-hub---radio">Media Hub - Radio&lt;/h3>
&lt;p>
&lt;img src="Media/MediaHub-Radio.png" alt="Radio" width="600">
&lt;img src="Media/MediaHub-Radio-Expand.png" alt="Radio Expanded" width="600">
&lt;/p>
&lt;h3 id="media-hub---video-player">Media Hub - Video Player&lt;/h3>
&lt;p>
&lt;img src="Media/MediaHub-Video.png" alt="Video" width="600">
&lt;img src="Media/MediaHub-Video-Expand.png" alt="Video Expanded" width="600">
&lt;/p>
&lt;hr>
&lt;h2 id="problem">&lt;strong>Problem&lt;/strong>&lt;/h2>
&lt;p>Users often juggle multiple standalone apps for weather, alarms, music, and productivity tools, resulting in a fragmented desktop experience. Vantage Hub consolidates these core features into a single cohesive application that provides quick access to everyday utilities, reducing cognitive load and improving workflow efficiency.&lt;/p>
&lt;hr>
&lt;h2 id="key-features">&lt;strong>Key Features&lt;/strong>&lt;/h2>
&lt;h3 id="-home-dashboard">&lt;strong>🏠 Home Dashboard&lt;/strong>&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Real-time Weather&lt;/strong> — 5-day forecast with dynamic weather icons, temperature, humidity, wind speed, and precipitation probability using &lt;a href="https://openweathermap.org/api" target="_blank" rel="noopener">OpenWeatherMap API&lt;/a>&lt;/li>
&lt;li>&lt;strong>Real-time Clock&lt;/strong> — Day/date/time with time-aware greeting (Morning / Afternoon / Evening / Night)&lt;/li>
&lt;li>&lt;strong>Customizable Greetings&lt;/strong> — Personalize your dashboard greeting message&lt;/li>
&lt;li>&lt;strong>Touch-first Interactions&lt;/strong> — Drag + transform support via manipulation handlers&lt;/li>
&lt;/ul>
&lt;h3 id="-alarm--stopwatch">&lt;strong>⏰ Alarm &amp;amp; Stopwatch&lt;/strong>&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Smart Alarm System&lt;/strong> — Create, edit, and manage alarms with:
&lt;ul>
&lt;li>Repeating days (weekday selection)&lt;/li>
&lt;li>Custom alarm sounds (6 built-in tones)&lt;/li>
&lt;li>Visual time-remaining countdown&lt;/li>
&lt;li>One-time alarms (auto-disabled after expiry)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Stopwatch&lt;/strong> — Precision timer with start/pause/reset controls&lt;/li>
&lt;li>&lt;strong>JSON Persistence&lt;/strong> — Alarms and preferences saved locally&lt;/li>
&lt;/ul>
&lt;h3 id="-media-hub">&lt;strong>🎵 Media Hub&lt;/strong>&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Local Music Player&lt;/strong> — Built-in music library with album art
&lt;ul>
&lt;li>Play/Pause, Next/Previous track controls&lt;/li>
&lt;li>Shuffle (Fisher-Yates algorithm) and Loop modes&lt;/li>
&lt;li>Volume control with mute toggle&lt;/li>
&lt;li>Progress bar with seek functionality&lt;/li>
&lt;li>🎶 &lt;em>All included music is royalty-free by &lt;a href="https://incompetech.com/" target="_blank" rel="noopener">Kevin MacLeod&lt;/a>&lt;/em>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Live Radio Streaming&lt;/strong> — Browse and play Singapore radio stations via &lt;a href="https://www.radio-browser.info/" target="_blank" rel="noopener">Radio Browser API&lt;/a>
&lt;ul>
&lt;li>Auto-filtered for working stations with valid cover art&lt;/li>
&lt;li>Metadata display (codec, bitrate, votes)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Video Player&lt;/strong> — Play local video files (mp4, mkv) with fullscreen mode and file picker support&lt;/li>
&lt;/ul>
&lt;h3 id="-doodle--ai-chat">&lt;strong>🎨 Doodle + AI Chat&lt;/strong>&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Digital Canvas&lt;/strong> — InkCanvas-based drawing with:
&lt;ul>
&lt;li>Pen/Eraser tools with pressure support (stylus)&lt;/li>
&lt;li>Color picker and adjustable brush size&lt;/li>
&lt;li>Load background images for tracing&lt;/li>
&lt;li>Save drawings as PNG&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>AI Chatbot&lt;/strong> — Powered by &lt;a href="https://ai.google.dev/" target="_blank" rel="noopener">Google Gemini API&lt;/a>
&lt;ul>
&lt;li>Text-to-Speech (TTS) for responses&lt;/li>
&lt;li>Copy response to clipboard&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Speech Recognition&lt;/strong> — Voice input for chat using Windows Speech API&lt;/li>
&lt;li>&lt;strong>Hover-to-Reveal Layout Swap&lt;/strong> — Switch button to swap Doodle and Chat panels&lt;/li>
&lt;/ul>
&lt;h3 id="-app-switcher">&lt;strong>🔄 App Switcher&lt;/strong>&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Keyboard:&lt;/strong> &lt;code>Ctrl + Space&lt;/code> opens the app switcher; while holding &lt;code>Ctrl&lt;/code>, press &lt;code>Space&lt;/code> to cycle; releasing selects (Alt+Tab style)&lt;/li>
&lt;li>&lt;strong>Gesture:&lt;/strong> Swipe up from the bottom interaction zone to open the app switcher (touch-friendly)&lt;/li>
&lt;li>&lt;strong>Acrylic UI Effects&lt;/strong> — Modern Windows Fluent Design styling&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="tech-stack">&lt;strong>Tech Stack&lt;/strong>&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Category&lt;/th>
&lt;th>Technologies&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Framework&lt;/strong>&lt;/td>
&lt;td>UWP (Universal Windows Platform)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Language&lt;/strong>&lt;/td>
&lt;td>C#&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>UI&lt;/strong>&lt;/td>
&lt;td>XAML, Fluent Design System, Acrylic Effects&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Weather API&lt;/strong>&lt;/td>
&lt;td>&lt;a href="https://openweathermap.org/api" target="_blank" rel="noopener">OpenWeatherMap&lt;/a> (5-day forecast)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>AI Integration&lt;/strong>&lt;/td>
&lt;td>&lt;a href="https://ai.google.dev/" target="_blank" rel="noopener">Google Gemini&lt;/a> (generative AI)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Radio API&lt;/strong>&lt;/td>
&lt;td>&lt;a href="https://www.radio-browser.info/" target="_blank" rel="noopener">Radio Browser&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Speech&lt;/strong>&lt;/td>
&lt;td>Windows.Media.SpeechRecognition, SpeechSynthesis&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Inking&lt;/strong>&lt;/td>
&lt;td>Windows.UI.Input.Inking (InkCanvas)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Serialisation&lt;/strong>&lt;/td>
&lt;td>Newtonsoft.Json&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Platform&lt;/strong>&lt;/td>
&lt;td>Windows 10/11 (SDK 10.0.22621.0)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="api-keys--services">&lt;strong>API Keys &amp;amp; Services&lt;/strong>&lt;/h2>
&lt;p>This project uses external APIs that require authentication:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Service&lt;/th>
&lt;th>Purpose&lt;/th>
&lt;th>Get API Key&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>OpenWeatherMap&lt;/strong>&lt;/td>
&lt;td>Weather forecasts&lt;/td>
&lt;td>&lt;a href="https://openweathermap.org/api" target="_blank" rel="noopener">openweathermap.org&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Google Gemini&lt;/strong>&lt;/td>
&lt;td>AI chatbot&lt;/td>
&lt;td>&lt;a href="https://ai.google.dev/" target="_blank" rel="noopener">ai.google.dev&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Radio Browser&lt;/strong>&lt;/td>
&lt;td>Radio stations&lt;/td>
&lt;td>&lt;em>No key required&lt;/em>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="setting-up-api-keys">&lt;strong>Setting Up API Keys&lt;/strong>&lt;/h3>
&lt;ol>
&lt;li>Copy &lt;code>secrets.template.json&lt;/code> to &lt;code>secrets.json&lt;/code> in the project root&lt;/li>
&lt;li>Add your API keys to the JSON file&lt;/li>
&lt;li>&lt;strong>Note:&lt;/strong> &lt;code>secrets.json&lt;/code> is excluded from Git via &lt;code>.gitignore&lt;/code> to keep keys private&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="my-role">&lt;strong>My Role&lt;/strong>&lt;/h2>
&lt;p>Sole developer responsible for:&lt;/p>
&lt;ul>
&lt;li>End-to-end UWP application architecture and UI/UX design&lt;/li>
&lt;li>Integration of external APIs (weather, radio, generative AI)&lt;/li>
&lt;li>Implementation of alarms (recurring + one-time), sound playback, and stopwatch utilities&lt;/li>
&lt;li>MediaHub development (music library, radio streaming, video playback)&lt;/li>
&lt;li>InkCanvas drawing tools + export pipeline&lt;/li>
&lt;li>Accessibility-focused features (speech-to-text + text-to-speech)&lt;/li>
&lt;li>Persistent storage for alarms and user preferences&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="project-structure">&lt;strong>Project Structure&lt;/strong>&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Folder/File&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>App.xaml(.cs)&lt;/code>&lt;/td>
&lt;td>Application entry point&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>MainPage.xaml(.cs)&lt;/code>&lt;/td>
&lt;td>Home dashboard, weather, greetings, alarms, and stopwatch module&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Music.xaml(.cs)&lt;/code>&lt;/td>
&lt;td>MediaHub: music library + player, radio station browser, video playback&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Sketching.xaml(.cs)&lt;/code>&lt;/td>
&lt;td>InkCanvas doodle tools + AI chatbot (speech + TTS) + panel swap&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>OpenWeatherMap.cs&lt;/code>&lt;/td>
&lt;td>Weather API integration + data models&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>radio-API.cs&lt;/code>&lt;/td>
&lt;td>Radio station retrieval + streaming metadata client&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>SecretsManager.cs&lt;/code>&lt;/td>
&lt;td>API key management&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>secrets.json&lt;/code>&lt;/td>
&lt;td>Your API keys (not in Git)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>secrets.template.json&lt;/code>&lt;/td>
&lt;td>Template for secrets.json&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>audio/&lt;/code>&lt;/td>
&lt;td>Music &amp;amp; alarm sound files&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>musicart/&lt;/code>&lt;/td>
&lt;td>Album cover images&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>weather_icons/&lt;/code>&lt;/td>
&lt;td>SVG weather icons&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>icons/&lt;/code>&lt;/td>
&lt;td>UI icons for controls and navigation&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>video/&lt;/code>&lt;/td>
&lt;td>Sample video content&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="quick-start-user-controls">&lt;strong>Quick Start (User Controls)&lt;/strong>&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Switch apps:&lt;/strong> &lt;code>Ctrl + Space&lt;/code> (hold Ctrl, tap Space to cycle, release to select)&lt;/li>
&lt;li>&lt;strong>Touch switcher:&lt;/strong> Swipe up from the bottom zone to open the app switcher&lt;/li>
&lt;li>&lt;strong>Doodle/Chat layout:&lt;/strong> Hover to reveal the switch button, then tap to swap panels&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="permissions-required">&lt;strong>Permissions Required&lt;/strong>&lt;/h2>
&lt;p>The app requires the following capabilities (configured in &lt;code>Package.appxmanifest&lt;/code>):&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Location&lt;/strong> — For weather based on current location&lt;/li>
&lt;li>&lt;strong>Microphone&lt;/strong> — For speech recognition&lt;/li>
&lt;li>&lt;strong>Internet&lt;/strong> — For API calls and radio streaming&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="outcome">&lt;strong>Outcome&lt;/strong>&lt;/h2>
&lt;p>This project demonstrates proficiency in:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>UWP Development:&lt;/strong> Building a polished multi-page Windows application with touch-first UX&lt;/li>
&lt;li>&lt;strong>API Integration:&lt;/strong> Consuming live data sources for weather, radio, and AI features&lt;/li>
&lt;li>&lt;strong>Multi-feature Architecture:&lt;/strong> Coordinating alarms, media playback, AI chat, and inking within a cohesive UI&lt;/li>
&lt;li>&lt;strong>Accessibility:&lt;/strong> Speech-to-text and text-to-speech for inclusive interaction&lt;/li>
&lt;li>&lt;strong>State Management:&lt;/strong> Persistent storage, timers, and async flows across multiple modules&lt;/li>
&lt;/ul></description></item></channel></rss>