A Senior UX Designer Jone Lee
Designing intuitive, I use animation as a third dimension by which to simplify experiences.
Inquisitive and passionate about emerging technology.
I’m Tom Latham, a Senior UX Designer with over 14 years of hands-on experience in User Experience, Product Analytics, and Strategic Thinking.
Currently, I’m dedicated to creating user experiences that harness AI to enhance data visualization, predictive modeling, and insights for users across various domains at Qlik.
For a more comprehensive understanding of my qualifications and career achievements, please visit my LinkedIn profile .
Selected projects
Boosting Conversions by 40%
Discover how our strategic UX/UI enhancements transformed a struggling e-commerce site into a revenue-generating powerhouse.
Simplifying Complexity
Enhancing Student Success
See how our design improvements on an e-learning platform led to higher engagement, better retention rates, and improved learning outcomes.
Selected projects
UX DESIGN
UX Research
Information Architecture
Wireframing
Prototyping
Usability Testing
UI DESIGN
Visual Design
Layout Design
Visual Interface
Responsive Design
Design System
Enhancing Student Success
See how our design improvements on an e-learning platform led to higher engagement, better retention rates, and improved learning outcomes.
Tools I use
Commendations
Nevine Acotanza
Chief Operating OfficerAndroid App Development
via Upwork - Mar 4, 2015 - Aug 30, 2021 testMaecenas finibus nec sem ut imperdiet. Ut tincidunt est ac dolor aliquam sodales. Phasellus sed mauris hendrerit, laoreet sem in, lobortis mauris hendrerit ante. Ut tincidunt est ac dolor aliquam sodales phasellus smauris test
Jone Duone Joe
Operating OfficerWeb App Development
Upwork - Mar 4, 2016 - Aug 30, 2021Maecenas finibus nec sem ut imperdiet. Ut tincidunt est ac dolor aliquam sodales. Phasellus sed mauris hendrerit, laoreet sem in, lobortis mauris hendrerit ante. Ut tincidunt est ac dolor aliquam sodales phasellus smauris
Nevine Dhawan
CEO Of OfficerAndroid App Design
Upwork - Mar 4, 2016 - Aug 30, 2021Maecenas finibus nec sem ut imperdiet. Ut tincidunt est ac dolor aliquam sodales. Phasellus sed mauris hendrerit, laoreet sem in, lobortis mauris hendrerit ante. Ut tincidunt est ac dolor aliquam sodales phasellus smauris
Blog post
Crucial Points for Android Developers: Building Efficient, Secure, and User-Friendly Apps.
In today’s competitive app ecosystem, Android developers must focus on efficiency, security, and user experience (UX) to build successful apps. While it’s easy to get caught up in adding features, these three pillars form the foundation of a great mobile application. Here are the crucial points every Android developer should keep in mind when developing any project.
1. Efficiency: Optimizing Performance
App performance is critical. An efficient app loads quickly, consumes minimal memory, and provides a smooth user experience. Here’s how to ensure efficiency in your Android app:
a. Minimize UI Overdraw
Overdraw occurs when the same pixel is drawn multiple times in a single frame, leading to unnecessary rendering and slowdowns. Use Android Studio’s Debug GPU Overdraw tool to identify and minimize overdraw by reducing the complexity of your layouts.
b. Use Efficient Data Structures
Choose the most appropriate data structures to store and process data. For example:
- Use SparseArray instead of HashMap for integer keys, as it saves memory.
- Avoid using nested data structures that can lead to performance overhead.
c. Leverage Background Processing Wisely
Offload heavy or long-running tasks to background threads using WorkManager, AsyncTask, or Coroutines. Ensure that background tasks are handled efficiently without blocking the main UI thread, which can cause your app to freeze or lag.
d. Use View Binding or Data Binding
Both View Binding and Data Binding can help reduce the amount of boilerplate code in your app, improving performance by eliminating the need for findViewById()
. View Binding also helps reduce the chances of memory leaks, which can cause the app to crash or slow down.
e. Optimize Images and Resources
Large image files can slow down your app’s loading time and consume unnecessary memory. Use vector drawables for scalable icons and images, and compress raster images (like PNG, JPG) using WebP format, which significantly reduces image size without loss of quality.
2. Security: Protecting User Data
Security should be top-of-mind for every developer. With increasing privacy concerns and regulations like GDPR, it’s vital to secure user data and prevent vulnerabilities in your app.
a. Implement Secure Data Storage
Never store sensitive information (e.g., user credentials, API tokens) in plain text or SharedPreferences. Instead:
- Use Android Keystore for securely storing cryptographic keys.
- Encrypt files using AES encryption and ensure secure database storage with SQLCipher.
b. Use HTTPS Everywhere
All network communications should be encrypted with HTTPS to protect against man-in-the-middle attacks. Use SSL pinning to ensure that your app only communicates with trusted servers and detect if someone is trying to intercept the connection.
c. Handle Permissions Carefully
Android provides granular control over permissions. Only request the permissions your app genuinely needs, and always request them at runtime (not at install time). For example:
- Use Scoped Storage in Android 10 and above to limit access to external storage.
- Always respect user privacy and avoid collecting unnecessary data.
d. Secure API Communication
When making API calls, ensure:
- You’re using OAuth 2.0 or other secure authentication mechanisms.
- Never hard-code API keys or secrets within your app code. Use secure mechanisms like environment variables or server-side configurations.
- Validate all inputs from users to avoid injection attacks (SQL Injection, XSS).
e. Code Obfuscation
Obfuscate your code using ProGuard or R8 to prevent reverse engineering. This reduces the risk of malicious users decompiling your app and tampering with sensitive logic.
3. User Experience: Building an Intuitive and Enjoyable App
A seamless, intuitive user experience is key to retaining users and improving engagement. An app that’s hard to navigate or doesn’t meet user expectations will quickly be abandoned.
a. Optimize for Different Devices and Screen Sizes
With Android being used on a variety of devices, your app needs to be responsive. Use ConstraintLayout to create adaptive layouts that adjust gracefully to different screen sizes, and support multiple screen densities by providing appropriate image assets in the res/drawable directories (ldpi, mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi).
b. Prioritize Accessibility
Make your app accessible to all users, including those with disabilities. Some tips:
- Use contentDescription for images to help visually impaired users.
- Provide keyboard navigation and focus indicators for users with motor disabilities.
- Test your app with TalkBack and other Android accessibility services.
c. Keep UI/UX Simple and Intuitive
Avoid cluttered UIs and focus on simplicity. Each screen should have a clear purpose with only essential components visible. Use:
- Material Design principles to guide the layout, colors, and animations.
- TabLayout or Navigation Drawer for easy navigation between sections.
- Provide meaningful animations for transitions and interactions, but avoid overloading the app with excessive or slow animations that can frustrate users.
d. Handle App States Efficiently
Handle app states such as loading, empty, error, and success gracefully. For example, use:
- Skeleton loading screens to improve perceived speed when fetching data from the network.
- Retry mechanisms when the network fails, and always give users feedback if something goes wrong.
e. Provide Offline Functionality
For a better user experience, make sure your app works offline or with poor connectivity. Implement local caching using Room or SQLite to store data offline and synchronize when the network is restored.
4. Testing: Ensuring a Smooth and Reliable App
Rigorous testing can help you catch bugs early and ensure your app runs smoothly in different environments.
a. Unit Testing and UI Testing
Use frameworks like JUnit for unit tests to ensure that your business logic works correctly, and Espresso for UI testing to simulate user interactions and verify that the app responds correctly.
b. Performance Testing
Use Android Profiler in Android Studio to monitor your app’s CPU, memory, and network performance. This helps identify bottlenecks and optimize your app for better performance.
c. User Testing
Before launching, test your app with real users in a beta release to gather feedback and identify potential issues. Google Play’s beta testing feature allows you to test the app with a specific group before the general release.
Google Play Console 2024 Updates: What Developers Need to Know.
As Android developers, keeping up with the latest Google Play Console requirements and policies is crucial to ensure that your apps comply and perform well. In July 2024, several updates were made to the Google Play policies, impacting developers across the globe, particularly in SEA/ANZ. This blog will walk you through the most important changes, helping you to stay ahead of the curve and ensure smooth app development and deployment.
There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don’t look even slightly believable. If you are going to use a passage of Lorem Ipsum. You need to be sure there isn’t anything embarrassing hidden in the middle of text. All the Lorem Ipsum generators on the Internet tend toitrrepeat predefined chunks.
1. Play Console Registration Requirements
Starting August 31, 2024, developers who offer financial products, medical services, VPN functionality, or government services must register as an Organization in the Play Console. This change aims to ensure that these sensitive services are provided by entities that meet Google’s stricter verification standards.
If you offer any of these services, make sure to register as an organization to avoid interruptions to your app listings
2.Minimum Functionality Policy Renamed
Google has renamed the Minimum Functionality policy to the Spam, Functionality, and User Experience policy. The goal of this update is to clarify that only high-quality apps will be permitted on the Play Store. Apps that fail to meet performance benchmarks or have excessive spam-like behavior will face removal.
- Best Practice: Ensure your app provides a polished user experience and offers real value, avoiding any spammy behavior that could lead to rejection or removal.
3. SDK Requirements and Clarifications
In response to increasing concerns about the misuse of third-party SDKs, Google has updated its SDK Requirements page. These updates include examples of SDK-caused policy violations, such as spyware or improper use of Foreground Services.
- Action for Developers: Review any SDKs used in your app, ensuring that they do not violate Google’s policy. Spyware and improper use of services can lead to serious consequences, including app removal.
4. App Testing Requirements for New Developers
For personal developer accounts created after November 13, 2023, developers are now required to test their apps with at least 20 users for a minimum of two weeks before applying for access to production. This move helps ensure that apps meet quality standards before they are made public.
- Tip: Plan for sufficient beta testing, gathering feedback from real users to ensure a smooth production release.
5. Pre-Review Checks for Early Issue Detection
Google has introduced Pre-Review Checks to help developers catch potential problems before sending their apps for review. This process includes checks for incomplete declarations and technical quality issues.
- Developer Tip: Use these checks to minimize the chances of app rejection and streamline the review process.
6. Government-Made Apps and New Badges
A new Government Badge has been introduced for apps that are officially affiliated with government entities. This badge will be visible on the Play Store, providing assurance to users that the app is trusted.
- For Government Developers: Complete the necessary declarations in the Play Console to become eligible for this official endorsement.
7. Guidelines for Apps with Generative AI
With the rise of Generative AI tools, Google Play has strengthened its policies to ensure apps with AI-driven features operate responsibly. Developers are encouraged to thoroughly test AI models and avoid generating offensive content.
Action Step: If your app uses Generative AI, ensure compliance with these new policies and rigorously test for edge cases that could produce problematic results.
Kotlin Multiplatform (KMP) vs Flutter: A Comparative Guide for Cross-Platform Development.
In recent years, cross-platform development has gained significant momentum as developers seek to create apps that run on multiple platforms with a single codebase. Two major players in this space are Kotlin Multiplatform (KMP) and Flutter, both offering unique benefits and approaches to solving the cross-platform dilemma. But which one should you choose for your next project?
In this blog, we’ll explore the key differences between Kotlin Multiplatform (KMP) and Flutter, comparing their architecture, performance, development experience, and suitability for different use cases.
1. What Is Kotlin Multiplatform (KMP)?
Kotlin Multiplatform (KMP) is a feature of Kotlin that allows you to write common code that runs on multiple platforms, including Android, iOS, desktop, and web. KMP enables code sharing across different platforms while still allowing you to write platform-specific code when necessary.
Key Features of KMP:
- Shared Logic: You can write business logic, networking, and other shared code in Kotlin and reuse it across platforms.
- Native UI: UI code is written separately for each platform, which gives developers full control over the look and feel of their app on Android, iOS, etc.
- Flexible Architecture: KMP doesn’t force you to follow a specific architecture. You can integrate it into existing apps or start new projects using KMP.
2. What Is Flutter?
Flutter is Google’s open-source UI software development kit (SDK) that allows you to build natively compiled applications for mobile, web, and desktop from a single codebase. It uses Dart as its programming language and provides a complete framework for developing cross-platform apps with a consistent UI.
Key Features of Flutter:
- Single Codebase for UI: You can create a single user interface for multiple platforms (Android, iOS, web, desktop) using Flutter’s widget system.
- Custom Rendering Engine: Flutter uses its own rendering engine, which allows for pixel-perfect UI across platforms, eliminating the need to write platform-specific UI code.
- Hot Reload: One of the standout features of Flutter is its “hot reload,” which allows developers to see the results of their code changes instantly without restarting the entire app.
3. Architecture and Development Approach
Kotlin Multiplatform (KMP): Native-First Approach
KMP focuses on sharing business logic while keeping the UI and platform-specific code separate. You write the core functionality (networking, caching, data models, etc.) in Kotlin, which is shared across platforms. However, the UI code for Android and iOS must be written natively (in Kotlin for Android and Swift for iOS).
- Native UI: With KMP, you get the flexibility to write native UIs for each platform, resulting in better adherence to platform conventions and user experience.
- Code Sharing: While KMP excels in logic/code sharing, it doesn’t enforce shared UI, making it ideal for projects that prioritize a native look and feel.
Flutter: UI-First Approach
Flutter takes a UI-centric approach, where both the business logic and UI are written in a single codebase using Dart. Flutter handles rendering using its own engine, bypassing native components, which allows for uniform UI across platforms.
- Unified UI: Flutter’s widget system allows developers to build custom UIs that look the same across platforms, making it ideal for apps that need a consistent experience.
- Less Platform-Specific Code: Since Flutter manages most of the platform differences internally, there is little need for platform-specific code compared to KMP.
4. Performance Comparison
Kotlin Multiplatform (KMP) Performance:
KMP apps utilize native UI and native code execution. This means that KMP-based apps run at native speed and performance, especially for platform-specific functionalities like animations, camera access, or GPS usage.
- Native Performance: Since KMP uses native code, performance is usually on par with fully native apps.
- Platform-Specific Optimization: You can optimize performance separately for Android and iOS if needed.
Flutter Performance:
Flutter uses the Dart language and compiles to native machine code for mobile, desktop, and web apps. It renders the UI via Skia, a powerful 2D rendering engine, which allows for high-performance, pixel-perfect UI rendering.
- Smooth Animations: Flutter’s rendering engine handles complex animations and transitions smoothly at 60fps or higher.
- Unified Performance: Since Flutter handles most of the platform-specific operations internally, performance is relatively consistent across platforms.
5. Development Experience
Kotlin Multiplatform (KMP):
- Language Familiarity: If you’re already an Android developer, you’re likely familiar with Kotlin, which makes the learning curve for KMP relatively shallow.
- Tooling Support: KMP is fully integrated with Android Studio, and with IntelliJ IDEA for cross-platform development. However, the tooling and ecosystem for KMP are still evolving, especially for iOS development.
- Flexibility: KMP allows you to gradually adopt a cross-platform approach. You can share as much or as little code as you like and maintain full control over the native parts of your app.
Flutter:
- Quick Setup: Flutter provides a fast setup process, and its “hot reload” feature makes it easy to iterate quickly on your designs and logic.
- Single Language: You’ll need to learn Dart, which might be a learning curve if you come from a Kotlin/Java background. However, Dart is fairly easy to pick up.
- Rich Ecosystem: Flutter has a vast ecosystem of widgets and libraries that allow you to build complex UIs quickly.
- Visual Design: Flutter is great for creating highly custom UIs and animations, and its widget system is well-suited for rapid development.
6. Use Cases and Suitability
When to Use Kotlin Multiplatform (KMP):
- Existing Native Codebases: If you already have native Android or iOS codebases and want to share common logic without rewriting the entire UI, KMP is an ideal solution.
- Platform-Specific UIs: KMP is great if you need to deliver the best possible native UI for each platform, adhering to their design standards.
- Gradual Adoption: KMP can be introduced gradually, allowing you to share business logic while keeping platform-specific code intact.
When to Use Flutter:
- Consistency Across Platforms: If you need a single, uniform UI across platforms, Flutter is a better choice as it handles all platform-specific differences internally.
- Rapid Prototyping: Flutter’s hot reload and comprehensive widget system make it ideal for fast prototyping and building MVPs.
- Custom UI Requirements: Flutter excels in apps that require custom UI designs and highly dynamic interfaces, such as animations and transitions.
7. Community and Ecosystem
Kotlin Multiplatform (KMP):
- Growing Ecosystem: KMP’s ecosystem is growing, with more libraries supporting multiplatform projects, though it’s still not as mature as Flutter’s.
- Strong Kotlin Community: Backed by JetBrains and Google, Kotlin has a strong and expanding community, especially within the Android development sphere.
Flutter:
- Vibrant Ecosystem: Flutter has a rich ecosystem of third-party packages, and Google actively supports and maintains the framework. The community around Flutter is large, with extensive tutorials, packages, and resources.
- Cross-Platform Beyond Mobile: Flutter is rapidly expanding to web, desktop, and embedded devices, making it a versatile tool for multi-platform apps.