OnlineJobs is iOS 16 Ready

I just compiled our codebase to the latest Xcode 14 RC and everything looks good during testing. I am still not sure how I feel about the new iPhone 14’s Dynamic Island. It seems like a huge black unknown mass floating on the top. I am on a simulator though so, take my opinion with a grain of salt. With that being said, time to publish this build today and for Apple to review.…

Read more ⟶

Our Son Turned 4

Our kid turned 4 this week. We came back to the hotel where he was still tiny. Where we had to request a crib for our room. But now we can’t believe he’s 4 now! Sorry for the table shot, but I captured this perfect moment of them hugging. Our son is on the autism spectrum but it doesn’t mean he won’t show his appreciation and love to us. The next day’s aftermath, he can’t wait to play with his new toys.…

Read more ⟶

Stackoverflow Chat Recent History Backup

I just want to post my Stackoverflow recent chat history for nostalgic purposes. I hope that day never comes when Stackoverflow would also sunset their chat feature just like they did with developer profile. I joined the Android channel around 2012-ish. Hopefully, Stackoverflow would let me download the whole history one day.…

Read more ⟶

Legacy Android Library - Networking Valley

7 years ago I open-sourced my first Android library on GitHub. And shared it to my fellow Android devs in Stackoverflow’s Android channel. This is for sure one of my favorite highlights of my career.…

Read more ⟶

Mixpanel Code Refactor

Our app uses Mixpanel for analytical and strategic purposes. This post is about my refactoring journey. Mixpanel introduced another parameter in their getInstance() method called trackAutomaticEvents which is of a boolean data type. Now, this is the part that I didn’t anticipate because located throughout our codebase is this single line. MixpanelAPI.getInstance(this, Constants.MIXPANEL_TOKEN).track("Log In") But right now it is broken since the proper way to implement on the new version is this.…

Read more ⟶

Manjaro WTF!?

Just today I read two bad news regarding Manjaro Linux. The first one is why you shouldn’t use Manjaro and the other one is why I left PINE64. Both articles went viral on Hacker News. On the same day. Same morning. I guess I better start looking for another distro.…

Read more ⟶

My First Professional Android Project

I found my first “professional” Android project while backing up data from my old laptop. I called it a “birthday reminder” and this project was the one I demoed to the company I sent my application to. Now, I am unsure if I got the gig because the Android team lead was amazed by the project I demoed or because I am the only applicant. Yes, I was the only applicant for the job interview.…

Read more ⟶

Be Nice To Your Mobile Developers

We need more wholesome reviews like the photo below. I received this notification this morning and I don’t care if it is a bot (at least somebody took the time to target and review) or a real person. As long as it is a positive review. Mobile developers don’t get a lot of positive reviews lately. It’s just either someone threatens you on a personal level or tells you to quit your career and job.…

Read more ⟶

Stay Safe Bug

During the Covid pandemic, every country has its own app or service to help track and monitor citizens for infection. And to prevent spread. One of these was the Stay Safe app. Before being bought by the Philippine government, this was developed by a company called MultiSys. I have checked their website and that’s it. One thing I know is that their email doesn’t work. The Bug I don’t have a Stay Safe account but one thing I know is that they were using a third-party called Uploadcare for handling the assets.…

Read more ⟶

Became a Subreddit Moderator

Last night I was invited to moderate the subreddit /pinoyprogrammer to which I have been contributing a lot for around a year already. It truly is an honor to get recognized and moderate an online community, in particular Reddit. You could say my first time doing this. I hope I don’t screw this up.…

Read more ⟶

Compiling Android on the Command Line

First of all, I am on Manjaro Xfce environment for this example. We need to install Gradle. I tried to install Gradle using ArchLinux’s pacman but it was very outdated. So based on Gradle’s installation guide one option is to use a package manager like Sdkman. Let’s go ahead and install SDKMAN!. curl -s "https://get.sdkman.io" | bash source "$HOME/.sdkman/bin/sdkman-init.sh" After running SDKMAN!, close the current terminal and open a new one.…

Read more ⟶

Legacy Projects Part 1

Development Date: Last Quarter 2012 This was one of my app ideas back in 2012 where users can save important notes. I developed this using Eclipse IDE with Android SDK. And the screenshots are from Google’s Nexus 7, still their best device.…

Read more ⟶

Familiarizing Linux Again Part 2

So I was able to install Manjaro KDE last night because the new USB drive was delivered yesterday. I tried to install Pop!OS but somehow I was unsuccessful. I’m glad since I really enjoyed Manjaro. The first order of business is upgrading all the packages and then I installed Google Chrome. After which I installed Thunderbird and set up my email iCloud account from Apple. This morning I was able to install Android Studio.…

Read more ⟶

Diablo Immortal

My wife and I started playing Diablo Immortal yesterday and I’m so happy she’s enjoying it. I played my usual barbarian character while she played the wizard. I love how the graphics are so much improved and the storyline is solid same as the previous Diablo II PC game. I told my brother about the game because he was the one who introduced me to this game when we were just kids.…

Read more ⟶

The Curse of Monkey Island Game Revisit

Since the upcoming return of the game franchise, Monkey Island was everywhere on the gaming news. I’m not into games anymore, but I followed Ron Gilbert lately and I was frustrated by the backlash he was receiving. I think the animation is cool! Can’t wait to play it. I played The Curse of Monkey Island when I was in grade school. And it was my favorite game. I am now playing it again.…

Read more ⟶

Smartmatic Hacked by Kids

I just found out that the XSOX group has been arrested. It turns out, they’re just some kids who hacked Smartmatic. Kids. Back in January 2022, I tried to warn everybody about this leak but only a few seemed to believe me. I have to take down my post back to private because of the backlash. After that week, I removed myself from any news about it. Below is the excerpt.…

Read more ⟶

Familiarizing Linux Again

After more than 5 years on macOS, I’m excited that I get the chance to use Linux again. My brother gave me his old Windows laptop. Since I figured it has 1TB of disk space in it, I decided to create a Linux partition. So I asked Silicon Valley’s best for help on which distro to install. There were no clear winners though. I started out my career using Linux and Eclipse IDE for Android development.…

Read more ⟶

Social Distortion - Bad Luck Cover

This made me feel old. This is one of my favorite Social Distortion songs and the song was covered by Chuck Ragan. Chuck is one of my favorite band vocalists and with him singing on a boat while the background looks like something from the Netflix show Ozark. Currently, I am deep in Season 2 right now. …

Read more ⟶

Git Checkout to Switch

I have finally made the switch from using mainly git checkout develop to git switch develop And a couple of things new to Git v2.37.0 and that is git config core.fsmonitor true git config core.untrackedcache true …

Read more ⟶

SwiftUI Journey Part 11: Passing parameters

Right now I am still figuring out how to pass a parameter from one View to another. I read I need to use @Binding but don’t know what it is. Or what differs it from @State. Currently, I am still studying @Binding. All the tutorials and Apple documentation look good but they did not include what to do with the compile error in PreviewProvider. Well, it seems PreviewProvider is separate and you can pass static variables different from the View class.…

Read more ⟶

SwiftUI Journey Part 10: Settings

I can’t believe how easy it is to implement a settings page in SwiftUI. For the UI, I only need 37 lines. Of course, this implementation won’t be accepted by the programming gods. Why you may ask. This is implemented in a static way. What if you want to turn every Text() background to Color.yellow. Then you will have to add the modifier background to every Text() view. Let’s make it dynamic.…

Read more ⟶

WWDC 2022

I haven’t yet written about this year’s WWDC 2022. In fact, I am still going through all the developer videos while also exploring Xcode’s Multiplatform introduced this year. I will try to write down some of my initial thoughts and frustrations from this year’s Apple WWDC event. WebView in SwiftUI, where art thou? I tried to ask this question in Slack during one of Apple’s Digital Labs, I guess it was with the SwiftUI team.…

Read more ⟶

URLRequest not working right away in macOS (AppKit)?

URLRequest not working right away in macOS (AppKit)? Do not forget to enable network capabilities in Xcode’s App Sandbox menu.…

Read more ⟶

Xcode 14 Multiplatform Migration First Look

The next version for OnlineJobs will be migrated to Xcode Multiplatform. So far it is looking great. iOS macOS Both are compiled with the same SwiftUI codebase.…

Read more ⟶

Post-Covid Vacation Part 3

A lot has happened this week. Wedding Anniversary Last Thursday was our wedding anniversary. We decided to bring Lucas to Ayala for the first time in more than 2 years. Playhouse It was Luke’s first time playing in Ayala’s Playhouse. Or his first time since the pandemic to play in a kid’s public playhouse. We weren’t sure what to expect when we arrived. First few minutes, Luke’s uneasiness was apparent.…

Read more ⟶

Pre iOS 16 - Last home screenshot

This is the last phone screenshot before Apple introduces iOS 16 later today. Of course, I will install it right away as soon as Apple releases the developer betas.…

Read more ⟶

Post-Covid Vacation Part 2

Lucas has been settling well into his new morning routine and every car ride activity for the past few days. Last Friday, it was his first evening car ride. And he enjoyed the traffic lights countdown. Weekend at Radisson We checked in at Radisson Hotel for the weekend for my wife’s sister’s wedding. Luke’s first night went well without any tantrums. As a matter of fact, the whole weekend Luke did not fuss or cried.…

Read more ⟶

Android's own HTTP library

I always wonder why Android doesn’t have its own HTTP library. They stopped supporting Volley and HttpURLConnection. For example on iOS, I don’t have to use third-party libraries for HTTP requests, because URLSession class is enough. On Android, new developers have to choose several HTTP libraries, plus they will encounter different arguments on which one is better and more robust. There is Ktor, Retrofit, Fuel, etc.…

Read more ⟶

Post-Covid Vacation Part 1

Day 1 Today is the first time my family has gone out together for about 2 years before Covid hits, lockdown, etc. We lived about 2-3 hours (with traffic) from the city. And as one of the effects of the Covid lockdown, our son hates the outdoors. We spent the past several months preparing him for this big day. Preparations like driving around town without freaking out. The last time we did this he cried, puked, and was seasick.…

Read more ⟶

Hiring for Android SDK

We are in search of “a Android SDK”. Why do I get the feeling that this email was generated by a bad case of AI/ML.…

Read more ⟶

Late Git Tagging

Git tagging is useful for marking the point of the release cycle of a version. But sometimes, we forget to even implement git tag. Here are some quick commands on how to do it for those that are still new to git. Detach from head git checkout 7b027ef 7b027ef could be any hash, this is just from a real-world example. Then a long-ass message will appear. This seems scary to read but no need to panic.…

Read more ⟶

SwiftUI Journey Part 9: WKNavigationDelegate

Next on the task is how to extend the class WKNavigationDelegate so I can call the evaluateJavascript() function. We used an ' extension' in our existing iOS app using UIKit. But I found out, that this won’t work when using SwiftUI. extension MyJobsViewController: WKNavigationDelegate { } After further Googling, research and internet digging I learned that I need to use makeCoordinator() function. Creates the custom instance that you use to communicate changes from your view controller to other parts of your SwiftUI interface.…

Read more ⟶

SwiftUI Journey Part 8: Using WebView in macOS

There is no WebView in SwiftUI, so you have to use the NSViewRepresentable class. import SwiftUI import WebKit struct OnlineJobsWebView: NSViewRepresentable { var url: URL func makeNSView(context: Context) -> WKWebView { return WKWebView() } func updateNSView(_ webView: WKWebView, context: Context) { webView.load(URLRequest(url: url)) } } And you call it in your SwiftUI View. import SwiftUI struct AccountView: View { var body: some View { OnlineJobsWebView(url: URL(string: "https://google.com")!) } } struct AccountView_Previews: PreviewProvider { static var previews: some View { AccountView() } } …

Read more ⟶

So, this is what AppKit’s TabView looks like. Not really sure if I like it or not. Might need to review Apple’s macOS UI guidelines.

Interview about Ethical Hacking

I was supposed to be interviewed by the Grade 11 STEM Students from Marist School, Marikina, about Ethical Hacking. 1. Can you tell us what you know about hacking? Hacking is like everything else, there is a good and bad side to it. The bad is what you usually see or hear in the news where criminals hack systems to steal data, destroy systems, install malware, and lock the systems behind ransomware.…

Read more ⟶

SwiftUI Journey Part 6: Async/Await with SwiftUI

Today I learned how to call async/await functions with SwiftUI. This has the same flow with the sign in page but this one is using concurrency. On that note, I need to refactor the sign in page to use concurrency. import SwiftUI struct MainView: View { @State private var signInSuccess = false var body: some View { if signInSuccess { HomeView() } else { VStack { Image("OnlineJobs Logo") .aspectRatio(contentMode: .fit) .…

Read more ⟶

Several updates went out from Apple today: macOS Monterey 12.4, Xcode 13.4, iOS 15.5 and several others.

IT Outsourcing

I read this article today about IT outsourcing and how it is affected by the war in Ukraine. Ukraine is one of the top, if not the top destination for IT outsourcing, so this is a long-term issue. The global market for IT services has exploded in line with the overall growth of tech, which has become a $4 trillion dollar industry. Finding the talent to meet the growing demand for technical services is more difficult than ever, which has driven companies to hire IT employees across the globe, outsourcing to countries like the Philippines, India and, increasingly in recent years, Ukraine, Poland, Bulgaria and other Eastern European countries.…

Read more ⟶

Today is me and my wife’s anniversary! 6 years ago she said yes to me. Time flies!

2022 Album of the Year

Mr. Morale & the Big Steppers by Kendrick Lamar…

Read more ⟶

Google I/O 2022 Part 2

So far I have watched the Google I/O Keynote and What’s New With Android 13. And read a couple of blogs from the Android Developer team. Below are the things that caught my attention, or eyes. Sundar is so thin I apologize in advance but this was the first thing I noticed when he walked out on that stage. Maybe it’s just because of his attire. But he should be eating more.…

Read more ⟶

Google I/O 2022 Part 1

Today marks my 10th Google I/O. There is still a lot of new information to check out later. But the first thing I did was explore the virtual adventure. This time I took a lot of selfies.…

Read more ⟶

I wonder what’s wrong with Firefox?

Android Studio Chipmunk

The only clear difference I noticed is Android Studio’s About page. So simple, I bet they can’t find the time to draw that Chipmunk graphic design. Compared to the previous Android Studio Bumblebee about page. Package namespace also has been moved from AndroidManifest.xml to build.gradle.kts. You can check the git diff below.…

Read more ⟶

Outdated Apple Documentation alert in macOS Human Interface Guidelines.

Did Apple mean macOS 12?

SwiftUI Journey Part 5: Sign In To Home View

On iOS, to transition from a SignInViewController to HomeViewController after the user successfully signs in, you just have to call the makeKeyAndVisible(). But on macOS using SwiftUI, here’s how I did it. It took me a while to get this right. And, still not entirely sure if this is the way. Here’s what my sign in view looks like, some parts are removed obviously for security reasons. But the conditional logic is the same.…

Read more ⟶

SwiftUI Journey Part 4: OnlineJobs for macOS Coming Soon

Soon. Written in SwiftUI. So far I am completely sold to SwiftUI. As long as I don’t have to deal with AutoLayout anymore, that is a plus in my book. Just look at the image below, the sign-in screen UI took only at least 45 lines of code.…

Read more ⟶

This is my current dock. As you can see I work mainly on Xcode and Android Studio. I just want to emphasize that out of place icon from IntelliJ.

Jetpack Compose Not Stable Yet

Jetpack Compose is not yet stable. I could not just make it work in an existing project. There seems to be a conflict between viewBinding and compose. buildFeatures { viewBinding = true compose = true } Android’s official documentation is not much of a help either.…

Read more ⟶

Happy Mother's Day To My Wife!

Happy Mother’s Day to my wife. Thank you for everything that you do and I’m so proud of you! I missed hanging out with you in coffee shops, dining out, and watching movies in theaters. I hope we could get to do it again with our little Bimbim.…

Read more ⟶

What's your signature code?

What’s your signature code? Mine is initViews(), short for “initialize views”. Since the start of my development career, this is the first function that I will always write. In Java, the difference is just the semi-colon: initViews();. Looking at my old Android Java codes, it is somewhat amazing (for me) that I have continued this tradition still. This function is called inside viewDidLoad() for iOS or onCreate(Bundle savedInstanceState) for Android. Its purpose is to initialize all views and their properties during the launch of either AppCompatActivity or UIViewController.…

Read more ⟶

iOS 15.5 Developer Beta 4

I installed the latest iOS 15.5 Dev Beta build and so far I haven’t experienced any serious bugs or issues. Especially on the Message app, which from my experience from the previous build was so buggy. OnlineJobs app is also running fine on the latest developer beta.…

Read more ⟶

New Album Alert: Terror - Pain Into Power

I liked the new Terror album. Reminds me of there old albums Lowest of the Low and One With The Underdogs. Rate: 🔥🔥🔥🔥🔥 out of 5…

Read more ⟶

Finished reading: Checkmate in Berlin by Giles Milton. Very interesting read, there were some really shocking parts that might never get out of my head.

SwiftUI Journey Part 3

Now, the frames are static. I need the frames to be resizable. Time to Google. So eventually, you need to set maxWidth and maxHeight inside the frame(). struct SignInView: View { var body: some View { VStack { Text("Welcome to hourz.") } .frame(maxWidth: 900, maxHeight: 400) } } …

Read more ⟶

SwiftUI Journey Part 2

Time to implement the sign in page. Welp. Ahh, forgot the frame(). struct SignInView: View { var body: some View { Text("I'm Sign In") .frame(width: 700, height: 300) } } …

Read more ⟶

SwiftUI Journey Part 1: Initial Commit

The start of something new in the form of SwiftUI for the macOS platform. I have no significant experience with SwiftUI, but the best way to learn is just to go in and get your hands dirty. This is my app idea, and hopefully, will turn into a project and then a business.…

Read more ⟶

Why Is Hardcore Music Not Popular?

In my teenage up to college years, I was into hardcore music. My friends are in a hardcore band. I was their roadie, I got to shows and support other independent hardcore bands. A couple of weeks ago, I enjoyed watching Netflix's Metal Lords. I had fun watching it, I always love music-themed movies like School of Rock or Atlantic Records. Also, there are countless metal-themed movies already in the past.…

Read more ⟶

Flutter Development Reaction Part 1

I spent majority of my mobile development career on native app development, mainly Kotlin and Swift. And this is my perspective on using Flutter for the first time. I have only seen small code snippets and that’s it. This is my first time logging into Flutter’s official site. I Googled Flutter. And first thing came up is Flutter - Build apps for any screen. And I have to double check, why .…

Read more ⟶

Migrate Android build configuration from Groovy to Kotlin

Here are the steps I did when I migrated our Android build to Kotlin. Long story short, the reasons for migration is the syntax highlighting and built-in support with Android Studio. I searched for all single quotes and replaced them with double quotes. Migrate to function invocations in Kotlin syntax. As you noticed the parenthesis. Rename file settings.gradle to settings.gradle.kts Inside settings.gradle.kts, refactor code from include ':app' rootProject.…

Read more ⟶

Hobby Project - isitmybirthdayyet.py

For my upcoming birthday, I decided to write a program just for the fun of it. My initial idea was just a simple script to convert a hex string to the words “Happy Birthday Law!”. But it’s too simple and I wanted to refresh some little Python at the same time. So I wrote a small decent program that will check if it is my birthday yet or if not it will ask if you want a dad joke instead.…

Read more ⟶

StaySafe.ph Low Priority Bug

I was signing up for StaySafe.ph when out of curiosity, I look around in their public HTML code and saw an exposed public key (UPLOADCARE_PUBLIC_KEY). So I figured out this key is for uploading to UploadCare, interesting. As I look around UploadCare's API documentation, I noticed that for uploading an image you only need a public key. For communicating with their API, you need both public and secret key.…

Read more ⟶

Stackoverflow Developer Story Farewell

Since Stackoverflow will sunset Developer Story, I feel a little sad because this feature has been a part of me since starting out my Android developer career. Whenever recruiters asked for my resume or if I needed one, I mostly use their Developer Story PDF format since it is very detailed. Or I can send them a link to my developer profile. Indicated in my Stackoverflow profile is my hard earned reputation too, I also answered questions back in the day when I can.…

Read more ⟶

Day in the Life of a Developer Dad

7:14 AM My day begins with washing the milk bottles and the utensils of our 3 year old son. We don’t have nannies so me and my wife have always shared parenting responsibilities. Open Apple Music and play The Bouncing Souls - How I Spent My Summer Vacation album. 7:45 - 8:15 AM Coffee Time & Breakfast Brew coffee. While waiting for coffee, catch up on emails and Twitter. There is a new Xcode beta out today.…

Read more ⟶

Postmortem: ProGuard is annoying

This morning I received several crash reports from last night's release. I wasn't able to replicate this crash on my debug environment. So this should be a production-only crash. The first thing that came to my mind while I read the crash report is that this is a Proguard issue. The crash was happening in this class import android.content.SharedPreferences import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider class OnlineJobsViewModelFactory(val sharedPreferences: SharedPreferences) : ViewModelProvider.Factory { override fun <T : ViewModel> create(modelClass: Class<T>): T { return modelClass.…

Read more ⟶

UIKit Drawing Tutorial Fix

I tried the tutorial from raywenderlich.com but the behavior was incorrect. The canvas or UIImageView seems to move after lifting my finger. It tried to run the official project from raywenderlich.com but it has the same strange behavior. Luckily I found a solution, you need to change this line inside touchesEnded function // from UIGraphicsBeginImageContext(mainImageView.frame.size) // change to UIGraphicsBeginImageContext(view.frame.size) And that's it.…

Read more ⟶

Submitting Urgent Hotfix and Apple Wasted Time

I've been releasing several versions on the App Store for over 2 years now and then Apple suddenly rejected it Revise the purpose string in your app’s Info.plist file for the camera to explain why your app needs access and include an example of how the user's data will be used. I made it clear on the camera purpose permission that the user's data, which is the picture, is for their profile picture.…

Read more ⟶

Books I've Read Last 2021

For 2021, I really haven’t read that many books. So compared to last year’s list, this would be shorter. Killing The MobA Promised Land by Barack ObamaAn Ugly Truth: Inside Facebook's Battle For DominationGiannis: The Improbable Rise of an NBA MVPCountdown Bin LadenAndroids by Chet HaaseThe Storyteller by Dave Grohl …

Read more ⟶

Thank you Android!

I just finished reading Androids by Chet Haase, about the development journey of the Android platform towards the 1.0 release. First of all, this book is important to me. Besides that I am currently an Android developer myself but because I started my passion in professional programming as an Android developer back in 2011. Technically I started as a PHP programmer but I hated it back then. Look, I am not in Silicon Valley or the USA, I am in a small city in the Philippines where doctors and engineers are more prestigious than programmers.…

Read more ⟶

iOS 15 Button Title

If you encountered default titles on your UIButton when using setImage() like my situation below. As you can see on the screenshot below, I removed the title. So everything should be alright. And when I run it on my iOS 15 device. What the. Anyway, solution is simple. On your UIButton's Atrribute inspector, set the style to default and remove the default Button title. Let me know if you have any questions.…

Read more ⟶

Realm Kotlin Tutorial

First things first, make sure you followed the official Realm tutorial on how to install it on your Android project. Here's how I implemented it on my Android project using Kotlin. After installation, initialize the Realm instance on your Application class or your launcher Activity. import android.app.Application import io.realm.Realm class MyApplication : Application() { override fun onCreate() { super.onCreate() Realm.init(this) } } Create your Realm object by extending the RealmObject class.…

Read more ⟶

Call Multiple APIs using Coroutines

Every time my app starts, I need to call 2-3 URL endpoints to get the latest data from the API. Every app encounters this scenario one way or another. I need to know when each API call finishes so that I can prompt the user a Snackbar or dialog to indicate that I already got the latest data. And more importantly, I made sure that calling the function 2-3 times won't block the main thread.…

Read more ⟶

Bluetooth printer scanning using Kotlin

One of the requirements of my current project is to be able to establish Bluetooth connection and send texts to print. See the video below for the result. Let's create an empty Android project and let's call it BluetoothPrintingSample. Then, create a layout folder inside res folder. Let's create a simple layout called activity_print.xml. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingStart="44dp" android:paddingEnd="44dp" android:background="@color/design_default_color_secondary" > <EditText android:id="@+id/editTextPrintMessage" android:layout_width="match_parent" android:layout_height="200dp" android:singleLine="false" android:background="@android:color/white" android:textColor="…

Read more ⟶

My 9th Google I/O

This week was all about Google I/O and this year was my 9th year watching the event. I enjoyed this year’s event compared to the last 2-3 years. It reminded me of when Google introduced Holo theme and Material Design. This year they introduced Material You. On the technical side, they introduced a bunch of updates to Jetpack and Jetpack Compose. And I’m excited to migrate some of my old codebases to Jetpack.…

Read more ⟶

Pass list of objects in Intent using Kotlin

Every Android developer is familiar with passing data between Activities using Bundle. The old Java way was to implement Parcelable class and then you override all the required methods. See example below. You can read more of the details here. public class MyParcelable implements Parcelable { private int mData; public int describeContents() { return 0; } public void writeToParcel(Parcel out, int flags) { out.writeInt(mData); } public static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.…

Read more ⟶

OnlineJobs for iOS (v4.5.2) Bug

Last week, it was one of those times where you know something went wrong when suddenly you get multiple Slack notifications. I received a Slack notification for every minute, I had to mute the channel. When I open the Bugsnag dashboard, I could see it was affecting hundreds of users. As of this moment, 154 users. Yikes! What took me so long was that Bugsnag wasn't able to capture all the other threads.…

Read more ⟶

Bintray Shutting Down

Next month, JFrog will shut down JCenter and Bintray and my experience with their service will go along with them. Before Gradle, and all this new Android artifacts/dependencies repositories, Bintray was the most popular back in 2015. During that year, I was able to publish an Android package called Networking Valley, it's still open source to this day. I called it Networking Valley to pay homage to a popular mobile game called Monumental Valley.…

Read more ⟶

Dynamic TableViewCell Height

I'm going to demonstrate on how I achieved the dynamic height for my UITableViewCell. Below is what it looks like. This is a UITableViewCell for comments. ImageView on the left side is for the user's avatar, the top most UILabel is for the username and lastly at the bottom is the UILabel for comment. Yes don't mind the red warnings, that is by design. The important here is for the UITableViewCell height to expand with AutoLayout.…

Read more ⟶

Nobody designs for small iPhone devices anymore

Nobody designs for small iPhone devices anymore. Why do I say this? Well, if you've been rocking the iPhone SE 2020 you would know. What I'm saying is there a lot of UI glitches from apps running on iPhone SE. Clubhouse Forgot to measure the screen's width? Spotify I can't see the Refresh button. I have to scroll up with my left thumb and then tap Refresh on my right.…

Read more ⟶

Code Refactoring: First Loom Video

In programming, you always encounter duplicate code blocks. The best thing to do is to place it in a separate function so that we can reuse it throughout our source code. [www.loom.com/share/9e5...](https://www.loom.com/share/9e5bf20a80eb4a2bac0fb4d8e71f957f) …

Read more ⟶

Keepr Storage Bug

Last year, I found a bug on Keepr Storage's Android app. It has the same bug as of Globe Telecom's where the API endpoint was not using secure HTTP. As a result, I can see my data in plaintext over Wi-Fi. Using Wireshark But as of version v1.3.6 of their app, this bug has been fixed already. They didn't respond to my email last year though.…

Read more ⟶

Play Looping Video using Swift

Playing a looping video in iOS is fairly simple but there's a catch. You need to declare AVPlayerLooper global in your class. Below is the code: let avPlayerItem = AVPlayerItem(url: videoOutputURL!) let avQueuePlayer = AVQueuePlayer(playerItem: avPlayerItem) let avPlayerLayer = AVPlayerLayer(player: avQueuePlayer) avPlayerLooper = AVPlayerLooper(player: avQueuePlayer, templateItem: avPlayerItem) avPlayerLayer.frame = videoPlayContainerView.bounds avPlayerLayer.videoGravity = .resizeAspectFill avQueuePlayer.actionAtItemEnd = .none videoPlayContainerView.layer.addSublayer(avPlayerLayer) avQueuePlayer.play() The videoPlayContainerView is a UIView.…

Read more ⟶

Government and its Test Pages

Philippine government sites are filled with "Test Pages". Not sure if this is just pure incompetence. Or a honeypot. Or lack of budget. [dict.gov.ph/test-page...](https://dict.gov.ph/test-page-2/) Yes, this department should know better considering IT is its main function. https://www.gov.ph/en/test-page?p_p_id=com_liferay_login_web_portlet_LoginPortlet&p_p_lifecycle=0&p_p_state=maximized&p_p_mode=view&saveLastPath=false&_com_liferay_login_web_portlet_LoginPortlet_mvcRenderCommandName=%2Flogin%2Flogin How about test page and sign in page combined. Nice. [www.gov.ph/test-page](https://www.gov.ph/test-page) How about a broken CSS currently live. [bfp.gov.ph/test-page...](https://bfp.gov.ph/test-page/#.YCuH_y0RpB0) Another one. (DJ Khaled voice) Even valid looking pages are still /test-page/…

Read more ⟶

Most active GitHub users in the Philippines

Just came upon this site while I was browsing, https://commits.top/philippines_private.html Based on the ranking as of today, I am number 17 on the list.…

Read more ⟶

Create a camera shutter in Swift

I'm going to show how I achieved the camera shutter button and animation using Swift, more or less the same with the stock iOS camera app. Grab a coffee because this one's going to be a little longer. Storyboard UI On your ViewController, drag a UIButton and place it at the bottom part. On the Size Inspector, give it a width and height of 65, thus creating a perfect square.…

Read more ⟶

Create a custom camera preview using Swift

If you are looking to create your own camera on iOS, I will demonstrate how I did it on my end. CameraPreviewView First of all you need to subclass UIView and inherit its properties. We will use this Swift file for our camera preview. import UIKit import AVFoundation class CameraPreviewView: UIView { override class var layerClass: AnyClass { return AVCaptureVideoPreviewLayer.self } var videoPreviewLayer: AVCaptureVideoPreviewLayer { return layer as! AVCaptureVideoPreviewLayer } var session: AVCaptureSession?…

Read more ⟶

2020 Was a Mixed Year

Mixed year because as good as the metrics are compared to last year, it saddens me that a huge number of people are laid off and companies closed because of Covid-19. Hopefully 2021 will be different. Here's a sneak peek of the OnlineJobs.ph app metrics during lockdown. In terms of number of installations, active devices and overall metrics, OnlineJobs.ph experienced significant gains throughout the year 2020. I rewrote the app, from React Native to Swift, back in January 2020 and released the new version a month after.…

Read more ⟶

Mobile App Dev 101: Technical Error Prompts are a no-no

Technical error prompts are a no-no. But not that important to submit a quick fix to your pipeline. But nonetheless, the reason is that for everyday users it feels like something is deeply broken with your app or worse, they feel like they are the ones who broke or crash it. More importantly they won't understand anything. URLSessionTask is a class for performing URL operations. In case you want to Google it.…

Read more ⟶

Books I’ve Read This 2020

As we close off the year 2020, I just want to share the books that I enjoyed reading. Some of this books were released this year and some are old. No Filter: The Inside Story of InstagramRise and Kill First: The Secret History of Israel’s Targeted AssassinationsEl Jefe: The Stalking of Chapo GuzmanShoe Dog: A Memoir by the Creator of NikeReworkThe Hacker and the State: Cyber Attacks and the New Normal of GeopoliticsThis is Not a T-Shirt: A Brand, a Culture, a CommunityPermanent RecordManhunters: How We Took Down Pablo EscobarNo Rules Rules: Netflix and the Culture of ReinventionAt the Devil’s Table: The Untold Story of the Insider Who Brought Down the Cali CartelTiradores: Missions and the Men of the Philippine’s Light Reaction RegimentMidnight at ChernobylSamsung Rising …

Read more ⟶

Go Manila Bug

I found a simple vulnerability of GoManila, the app from Manila's Office of the Mayor. The app is using Firebase for the backend and the developer forgot to set the privacy settings thus anyone can visit the link and view its data on https://gomanila.firebaseio.com/.json I reported it to the Office of the Mayor and settings was updated already.…

Read more ⟶

Globe Telecom Rewards Bug

I discovered that the Globe rewards app is communicating over insecure HTTP and because of this, it suffers from data leak. Using Wireshark I was able to read in clear plain text my phone number that I entered. I was able to contact Globe Telecom regarding this bug and was rewarded with 2,000 pesos. Lol.…

Read more ⟶

Mass Delete Firebase Authenticated Users

sudo pip install firebase-admin import firebase_admin from firebase_admin import credentials from firebase_admin import authcred = credentials.Certificate("/Users/lawrence/Projects//.json") app = firebase_admin.initialize_app(cred)for user in auth.list_users().iterate_all(): print("User ID = " + user.uid) python firebase_auth_nuke.py auth.delete_user(user.uid) import firebase_admin from firebase_admin import credentials from firebase_admin import authcred = credentials.Certificate("/Users/lawrence/Projects/StarTender/starme-dev-firebase-adminsdk-7l2d7-6456855c7d.json") app = firebase_admin.initialize_app(cred)for user in auth.list_users().iterate_all(): print("User ID = " + user.uid) auth.delete_user(user.uid) print("Deleted user ID " + user.uid) …

Read more ⟶

Google Maps and Directions API using Kotlin

I will implement below on how to implement Google Maps and Directions API using Kotlin and we are going to plot a route from origin to destination. I am not gonna include here on how to get the API Key from the Google Maps Platform Console as Google has a clear directions about it. We are going to assume that you have already obtained the API Key and already added the  in the AndroidManifest.…

Read more ⟶

Implement Chromecast on iOS using Swift

I am going to implement Google’s Chromecast on iOS using Swift. I will be using Google Chromecast 2 device and Xcode 9.4.1. First let’s read the Google Cast documentation to get familiar with it’s implementation. After getting familiar with the Get Started section, we need to register the Google Chromecast device. There will be a one time $5 fee for Google Cast Developer Registration. After paying, we will be redirected to Google Cast SDK Developer Console…

Read more ⟶

G Suite Happy Ending

Somehow, I got Google's attention. A representative of Google (I am not sure if I can mention his name here, but I would love to, let me know) contacted me on LinkedIn and that he would like to help out on my G Suite problem. This is nice, straight from Mountain View. Minutes later, someone from their APAC office called me to check up on my situation and I run down the events that happened.…

Read more ⟶

G Suite Horror Story

Yesterday my life long Gmail account has been deleted by Google because I integrated it with G Suite by cancelling the subscription. G Suite for business was a mean to upgrade your personal email so that all your inbox will be unified. But the more email gets into the inbox, the more cluttered it seems. It was hard to manage. Then, I searched for any way to break apart my personal Gmail from my G Suite account.…

Read more ⟶

Implementing the expandable cell in iOS UITableView

I’m going to implement below on how to create the expandable UITableView cell for example on iOS stock calendar. From scratch, create a new project on Xcode. In your main.storyboard remove the default ViewController (delete also the extra unused ViewController.swift file in the project explorer) and drag a new TableViewController. Now that we have our TableViewController set on the storyboard. Let’s create a new Swift file, and call it for example FormTableViewController.…

Read more ⟶