Tag Archives: featured

GSM Signal Monitor & SIM Info version 1.6.14 released

I’m happy to announce that a new version of GSM Signal Monitor & SIM Info is now available on Google Play

This release adds an option for playing ringtone and vibrating when signal is restored.

GSM Signal Monitor & SIM Info

GSM Signal Monitor notifies you when you have no GSM signal or mobile data.

Get it on Google Play

Ever wanted to call someone, but your phone has no GSM coverage?

Or you are living / working in a low signal area?

‘GSM Signal Monitor’ monitors the phone (or tablet with SIM card) signal strength and alerts you when you are out of service or in a low signal zone.

No signal / low signal alerts include: voice notifications, vibration, notification on the device screen and playing a ringtone. You can personalize how you get notified in the app settings.

‘GSM Signal Monitor’ can also notify you when the signal is restored, your mobile data is lost you are in a roaming area.

The app also provides information about device SIM cards such as phone number, voice mail number, SIM Card Serial number (ICCID), Subscriber Id (IMSI), mobile operator info and network type. This SIM card info can be easily shared by tapping on the share button or copied in the device clipboard.

‘GSM Signal Monitor’ logs every signal related event in its notifications log. The notification log keeps information when the GSM signal is lost, restored or low. It also logs information when the mobile data is lost or roaming is active. You can configure what’s logged in settings. The log can be exported in CSV, PDF and HTML formats.

Each logged event contains location and additional details about device and network states such as: network operator, network type, data connection state, roaming state, ram usage, battery temperature, battery state (charging/not charging) and battery level at the time of the event.

You can monitor your signal strength as it changes dynamically from the app main screen or in the notification area.

Features:

• Notifications when the signal is lost / restored
• Notifications when you are in a low signal zone (available as in-app purchase)
• Log events when data connection is lost or device enters roaming
• Event location and additional details
• Customizable log export in CSV, PDF and HTML formats. (available as in-app purchase)
• Detailed SIM card info
• 4G (LTE) signal monitoring
• Dual / multi SIM devices support (requires Android 5.1 or newer)
• Quiet hours (the app can be configured to suppress its notification during specified time period)
• Real time information about the GSM signal strength and quality in decibels (dBm)
• Low battery shutdown (GSM Signal Monitor will stop when device battery is low, the app will auto start again when the battery is sufficiently charged)
• Starting the app when the device starts
• App shortcuts
• Day Night theme with dark and light modes
• Simple/enhanced service notification styles and configurable behavior on how you get notified when actively using your device.
• Great number of configuration options

GSM Signal Monitor is NOT a signal booster app!

GSM Signal Monitor web page: https://getsignal.app/

Get it on Google Play

Push Ups Counter version 2.0 released

I’m happy to announce that a new version of Push Ups Counter is now available on Google Play

This release features:
* Redesigned/improved interface
* Dark mode
* Android 13 support
* Workout timer

Push Ups Counter main screen Push Ups Counter Push Ups Counter settings screen
Get it on Google Play

Push Ups Counter is an app that helps you count your push ups and records them in a training log where you can later review your progress day by day.

To start your workout press the ‘Start’ button. Push ups are recorded by the number of times your nose (or chin) touches the screen or if your device has ‘proximity sensor’ the number of times your head comes close to the screen. When you complete your workout, pressing the ‘Stop’ button will store the workout data in the training log.

Push Ups Counter features:
* Can count push ups with the device proximity sensor or touching anywhere on the screen.
* Workout timer
* Keeps the device screen on during a workout.
* Training log grouped by months.
* It prevents double counting if for example you lean toward the device proximity sensor and accidentally touch the screen.
* Plays beep sound when a push up is recorded (can be disabled from the settings screen).

Get it on Google Play

GSM Signal Monitor & SIM Info version 1.6.13 released

I’m happy to announce that a new version of GSM Signal Monitor & SIM Info is now available on Google Play

This release provides better eSim experience and adds support for Android 13.

GSM Signal Monitor & SIM Info

GSM Signal Monitor notifies you when you have no GSM signal or mobile data.

Get it on Google Play

Ever wanted to call someone, but your phone has no GSM coverage?

Or you are living / working in a low signal area?

‘GSM Signal Monitor’ monitors the phone (or tablet with SIM card) signal strength and alerts you when you are out of service or in a low signal zone.

No signal / low signal alerts include: voice notifications, vibration, notification on the device screen and playing a ringtone. You can personalize how you get notified in the app settings.

‘GSM Signal Monitor’ can also notify you when the signal is restored, your mobile data is lost you are in a roaming area.

The app also provides information about device SIM cards such as phone number, voice mail number, SIM Card Serial number (ICCID), Subscriber Id (IMSI), mobile operator info and network type. This SIM card info can be easily shared by tapping on the share button or copied in the device clipboard.

‘GSM Signal Monitor’ logs every signal related event in its notifications log. The notification log keeps information when the GSM signal is lost, restored or low. It also logs information when the mobile data is lost or roaming is active. You can configure what’s logged in settings. The log can be exported in CSV, PDF and HTML formats.

Each logged event contains location and additional details about device and network states such as: network operator, network type, data connection state, roaming state, ram usage, battery temperature, battery state (charging/not charging) and battery level at the time of the event.

You can monitor your signal strength as it changes dynamically from the app main screen or in the notification area.

Features:

• Notifications when the signal is lost / restored
• Notifications when you are in a low signal zone (available as in-app purchase)
• Log events when data connection is lost or device enters roaming
• Event location and additional details
• Customizable log export in CSV, PDF and HTML formats. (available as in-app purchase)
• Detailed SIM card info
• 4G (LTE) signal monitoring
• Dual / multi SIM devices support (requires Android 5.1 or newer)
• Quiet hours (the app can be configured to suppress its notification during specified time period)
• Real time information about the GSM signal strength and quality in decibels (dBm)
• Low battery shutdown (GSM Signal Monitor will stop when device battery is low, the app will auto start again when the battery is sufficiently charged)
• Starting the app when the device starts
• App shortcuts
• Day Night theme with dark and light modes
• Simple/enhanced service notification styles and configurable behavior on how you get notified when actively using your device.
• Great number of configuration options

GSM Signal Monitor is NOT a signal booster app!

GSM Signal Monitor web page: https://getsignal.app/

Get it on Google Play
Android, Smartphone, Android Developer, Android Studio

Auto ‘versionCode’ increment when building production apk’s

Since I adopted Fabric as a way to monitor vital app stats such as ‘Time in App per User‘ and it’s Beta distribution platform to distribute test builds, increasing APK’s versionCode numbers became a tedious task.

I decided to simplify the things by letting Gradle to do auto versionCode increments when producing release APK’s

Our implementation of build number increments will consist of a property file named version.properties located in the root folder of our project.

The property file will contain 2 variables, one defining the version name such as “2.3” and one defining the version code such as 15

VERSION_NAME=2.3
VERSION_CODE=19

In our app module build.gradle file

build.gradle

we will define a function which takes care of retrieving the a bough mentioned values from the properties file and increment the VERSION_CODE if needed.

/**
 * Get's value from 'version.properties' file
 * @param varName the name of the variable which value we wan't to get.
 * @return the variable value.
 */
def getVersionPropertiesValue(def varName)
{
    def propertiesFile = file('version.properties')
 
    if(!propertiesFile.canRead()) {
        throw new GradleException("Could not read " + propertiesFile.name)
    }
 
    Properties properties = new Properties();
    properties.load(new FileInputStream(propertiesFile))
 
    def propertyValue = properties[varName]
    if(varName == 'VERSION_CODE')
    {
        // If we are building release increment the version code
        List gradleTasksNames = gradle.startParameter.getTaskNames();
        for(String taskName : gradleTasksNames)
        {
            if(taskName.contains("Release"))
            {
                propertyValue = propertyValue.toInteger() + 1
                properties[varName] = propertyValue.toString()
                properties.store(propertiesFile.newWriter(), null)
                break
            }
        }
    }
 
    return propertyValue
}

In the defaultConfig section of the gradle build script we will call this function to retrieve values for the versionName and versionCode of our app.

android {
    compileSdkVersion 28
 
    defaultConfig {
        applicationId "com.example.foo"
        versionCode Integer.valueOf(getVersionPropertiesValue('VERSION_CODE'))
        versionName getVersionPropertiesValue('VERSION_NAME')
        minSdkVersion 14
        targetSdkVersion 28
    }
}

Now each time a release build is made, the version code will increment automatically. If we want to change the version name we can do so by changing the value of VERSION_NAME property.

Settings.canDrawOverlays() allays returns ‘false’ on Android O

I was updating one of my clients app, and testing it how it behaves on Android O (API 26). The app requires permissions to draw over system windows (android.permission.SYSTEM_ALERT_WINDOW). On Android 6 (API 23) and up, you are obligated to request ‘special’ permissions while the app is running.

The ‘SYSTEM_ALERT_WINDOW’ permission is a special permission that breaks the rules set by the new permission model available on Android 6 (API 23) and up. It’s request involves calling Settings.canDrawOverlays() and if it returns ‘false‘ starting ‘Settings‘ where the user can choose to grant your app the ability to draw overlays or not.

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
{
   // On API 23 and later ask the user to grant us permission to draw system overlay
   // windows.
   if (!Settings.canDrawOverlays(this))
   {
      Intent intent = new Intent(
             Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
             Uri.parse("package:" + getPackageName()));
 
      startActivityForResult(intent, REQUEST_PERMISSION_SYSTEM_OVERLAY_RESULT);
   }
}

There is a bug with Settings.canDrawOverlays() (only) on API 26 where it will always return ‘false’ disregarding the actual user decision. The workaround provided here is a bit ugly, but does not involves restarting the app (which will be quite annoying for the user) after the permission is granted.

The code below first checks the result of System.canDrawOverlays() if it returns ‘true’ it continues with the rest of the application flow. If it returns ‘false’ a check if we are running on Android O (API 26) is performed. If that’s the case, we are calling our ‘workaround’ method.

The ‘workaround’ method tries to add an invisible overlay window on the screen, and if that’s OK we assume that we have a permission to draw overlays, else an exception is thrown.

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        super.onActivityResult(requestCode, resultCode, data);
 
        if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return; if(requestCode == REQUEST_PERMISSION_SYSTEM_OVERLAY_RESULT) { if(Settings.canDrawOverlays(this)) { m_permissionSystemOverlayWindowGranted = true; if(m_permissionReadPhoneStateGranted && m_permissionProcessOutgoingCallsGranted) { startService(new Intent(this, EstatePlusService.class)); m_layoutNoPermissions.setVisibility(View.INVISIBLE); m_progressBar.setVisibility(View.INVISIBLE); m_layoutLogin.setVisibility(View.VISIBLE); } } else if(Build.VERSION.SDK_INT == Build.VERSION_CODES.O) { // NOTE: This is a workaround to fix the bug in Android O where the // Settings.canDrawOverlays() will always return 'false' if(canDrawOverlays(this)) { m_permissionSystemOverlayWindowGranted = true; if(m_permissionReadPhoneStateGranted && m_permissionProcessOutgoingCallsGranted) { startService(new Intent(this, EstatePlusService.class)); m_layoutNoPermissions.setVisibility(View.INVISIBLE); m_progressBar.setVisibility(View.INVISIBLE); m_layoutLogin.setVisibility(View.VISIBLE); } } } } } /** * Workaround for Android O */ public static boolean canDrawOverlays(Context context) { try { WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); if (windowManager == null) { return false; } final View viewToAdd = new View(context); WindowManager.LayoutParams params = new WindowManager.LayoutParams( 0, 0, android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O ?
                                    WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY : WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
                            WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSPARENT);
            viewToAdd.setLayoutParams(params);
            windowManager.addView(viewToAdd, params);
            windowManager.removeView(viewToAdd);
            return true;
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
 
        return false;
    }