Windows 8 and 8.1 don’t shutdown

One day my Windows 8.1 stopped shutting down. Restart works but shutdown seems to just turn off the screen after writing “Shutting down”. Clicking the mouse wakes the computer up at once.

This bug seems to be a feature, weirdly, a counter useful one in my opinion. It makes sure that you can turn the computer back on quickly by not shutting down. I can see the use in tablets but this is a PC. Really stupid decision.

Anyway, you can turn it off.

  • Press ‘start’
  • Start typing ‘Change what the power buttons do’ and when it appears click it
  • Click ‘Change settings that are currently unavailable’
  • Untick ‘Turn on fast startup (recommended)’

In my opinion, turning this on by default on PC’s is a stupid decision.

How to sync a Sandisk Sansa without a music manager

I’ve had enough of music managers. One supports only iPhones, one syncs only playlists, one doesn’t detect devices, one can’t cancel an accidental whole drive sync, etc. I know they sometimes work, I also used them in the past but this time they simply refused to work as I wanted.

I tried MediaMonkey, MusicBee, Windows Media Player and a few others, until I thought, why not use a simple sync application? You know, from the same category as rsync.

I looked what is available for Windows and found something interesting from Microsoft: Microsoft Sync Toy.

It allows you to select two folders, choose if you want to just copy or also delete from the destination folder and that’s about it. No hassles, simple, just as I like.
Note that you have to set your music player to connect as an MSC device instead of MTP. This means connect as a drive instead of a media device.

This is what it looks like:
sync_toy

Admit that you haven’t thought of it 🙂

Android – how to make UI values survive rotation

When programming for Android, you have to take into account that your application will be killed, paused and recreated without your consent. This is because of the nature of phones which have less memory and move from one task to another without the ability to support everything at the same time.

The example I’m going to take is screen rotation. When the screen rotates, the visible activity gets recreated. How do I know that? I have two Spinners on it, one with an adapter that changes according to the other’s selection. With each rotation I lost the current selection of the second Spinner. I added some Toasts to the code and found that onCreate() is being called upon orientation change. The first thing that comes to mind is to save the selection somewhere and restore it after the recreation.

There is a facility for that. Have you seen the parameter that your onCreate() gets?
protected void onCreate(Bundle savedInstanceState)
This savedInstanceState is a ‘bundle’ which means a space that Android gives your application to save some info between recreations of your activities. There are also two methods you can use to put the save and restore code in:

@Override
public void onSaveInstanceState(Bundle savedInstanceState)
{
    super.onSaveInstanceState(savedInstanceState);
    savedInstanceState.putInt("numberOfThings", num);
    savedInstanceState.putInt("anotherNumber", numnum);
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState)
{
    super.onRestoreInstanceState(savedInstanceState);
    num = savedInstanceState.getInt("numberOfThings");
    numnum = savedInstanceState.getInt("anotherNumber");
}

This didn’t help me completely because it was only then that I realized that onCreate is called for every rotation and in onCreate I initialized my UI elements to their default values. I tried putting num = savedInstanceState.getInt("numberOfThings") in onCreate to load the previous values but got a null reference exception on the first run because savedInstanceState is not initialized if this is the first run. The complete solution was to ditch onRestoreInstanceState and use only onCreate(). I set the default values in variables, and then did:

if (savedInstanceState != null)
{
    // Load variables here and overrite the default values
}

The rest of the initialization stayed as it was.

So the complete solution is:

  • Save the values you need in class members using onSaveInstanceState
  • In onCreate() restore the values if savedInstanceState != null and use them for initialization

That’s all folks.