Sunday, July 3, 2011

Forcing screen to stay on

Here's a nice way to make the screen stay on for a particular activity. Just put this in the onCreate method:

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);


It's nicer than the POWERLOCK method, which requires an additional permission in the manifest:

    <uses-permission android:name="android.permission.WAKE_LOCK">

And in your Activity:

    final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    this.mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
    this.mWakeLock.acquire();

    //and when you're done with the WakeLock:
    this.mWakeLock.release();

Monday, May 30, 2011

Android strings.xml

Here's a strange one - I was working on an Android application, using the strings.xml file for the apps string resources. It so happened that I needed to have two strings in both underlined and non-underlined forms. So I added:
<string name="average_underlined"><u>average</u></string>
<string name="recent_underlined"><u>recent*</u></string>
<string name="average">average</string>
<string name="recent">recent</string>


to the strings.xml file. However, when I ran the app the underlined versions appeared where I expected the regular version to appear. After checking and rechecking I was happy the code was correct. Bizarrely, the fix was to have the non-underlined versions declared first:
<string name="average">average</string>
<string name="recent">recent*</string>
<string name="average_underlined"><u>average</u></string>
<string name="recent_underlined"><u>recent*</u></string>


If anyone can explain this to me please do get in touch!

Thursday, May 26, 2011

Android - Aligning Two Views Side-by-Side

This was harder than I thought it would be - I tried playing about with relative views plus alignment settings, table views, gravity and so on.

The answer turned out to be use a LinearLayout with orientation set to horizontal and for each view (buttons in my case) set width to fill parent and layout_weight to "1":


<LinearLayout
  android:id="@+id/Table01"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:orientation="horizontal"
android:layout_alignParentBottom="true">    
<Button
android:id="@+id/button1"
android:layout_height="wrap_content"
android:textStyle="bold"
android:textSize="15sp"
android:layout_width="fill_parent"
android:layout_weight="1"
android:text="reset">
</Button>
<Button
android:id="@+id/button2"
android:layout_height="wrap_content"
android:textStyle="bold"
android:textSize="15sp"
android:layout_width="fill_parent"
android:layout_weight="1"
android:text="delete">
</Button>
  </LinearLayout>

Monday, May 2, 2011

Android ListViews

I've been working on an Android ListActivity which needs to have two TextViews anchored to the bottom of the screen. The anchoring was fairly simple, but when the list extended to the bottom of the screen, it obscured the anchored TextViews.

The solution is to declare the ListView last in your xml layout file, and specify what you want to be above it and what you want to be below it. I.e.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout  xmlns:android="http://schemas.android.com/apk/res/android
    ....>

    <TextView
        android:id="@+id/my_screen_header"
        .......>
    </TextView>

    <RelativeLayout
        android:id="@+id/my_screen_footer"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true">
        <TextView
            android:id="@+id/first_footer_text_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="15sp">
        </TextView>
        <TextView
            android:id="@+id/second_footer_text_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/first_footer_text_view"
            android:textSize="15sp">
        </TextView>
    </RelativeLayout>
    <ListView android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_above="@id/my_screen_footer"
        android:layout_below="@id/my_screen_header"/>
</RelativeLayout>

Thanks to http://blog.maxaller.name/2010/05/attaching-a-sticky-headerfooter-to-an-android-listview/

Saturday, April 23, 2011

Pain-free iTunes

Well, relatively pain free anyway. What a horrible horrible piece of software it is too - massive, slow, unintuitive. It make me feel tense using it. I use Linux as my OS but find that I have to use iTunes to manage music for my iPhone.

A little background - I have a lot of mp3s, all from CD ripped to the Uberstandard. Basically, this standard ensures the best possible mp3 reproduction of the CD, with all mp3 files tagged correctly. When I first started ripping CDs this way, I was told to avoid letting iTunes manage mp3s as it could change the tags, meaning the mp3 no longer met the standard. I'm not certain that this is still true, but I don't want to simply point iTunes at my music folder and let it do its stuff. I'm sure for people who are happy for their mp3s to be altered, iTunes does a fine job. For me, however, using iTunes means copying tracks to a new location before iTunes gets its paws on them.

I tried dragging and dropping from the new location onto the iTunes UI, but iTunes created duplicates of every track. Useless...

Anyway, because I use iTunes so infrequently (occasionally stick a load of tracks on the phone, get annoyed, and get the hell out of there) I've never really worked out the steps to follow each time that will work for me. I have now, and here they are:


  1. find the iTunes media folder. For me this is C:\My Music\iTunes\iTunes Media
  2. in there there is a folder called "Automatically Add to iTunes"
  3. choose the music you want to put on the phone/iPod and copy it to a new location
  4. from this new location, drag and drop the music files to the "Automatically Add to iTunes" folder
  5. if iTunes is running, it will automatically move the mp3s to the library. For me, it leave empty directories behind, but I can handle that
  6. now, back in iTunes, select the device you want the music added to. Select Music at the top of the screen, select Sync Music and select the "Selected playlists, artists and genres" option. This means on the artists/albums etc you choose lower down on the screen will be added to the device. Anything that is already on the phone but is not checked on this screen will be removed from the device. I think it's this bit that takes some getting used to
  7. click Apply

Friday, April 22, 2011

Obfuscating Android

Had a play around with Proguard today. It's an obfuscation tool. Instructions for setting it up for Android are here.

However, I received an error when running
    sudo ant release -v
 The error was:
    Expecting class path separator ':' before '{' in argument number 1

I found the answer - I just needed to add "external.libs.dir=libs" to the default.properties file.

Thanks to Android Bridge

Friday, February 4, 2011

Rsync

Decided I'd have a go at using rsync to do my backups. I played around with a few switches, but settled upon:
    -rltpDiv

I tried
    -aiv
but this attempts to preserve owner/group of files. This is no good for me, as the NSLU2 changes these attributes. I'm not bothered about this at the moment, I'm just interested in getting a backup to run which does transfer 10s of GB each time when all that's changed is file ownership.

So the full command to back up my home directory is:
    rsync -rltpiv /home/barry /media/nslu2/backup/rsync_home_backup --exclude '.gvfs' --exclude 'Dropbox'
where
    -r means recursive
    -l means copy symlinks as symlinks
    -t means preserve modification times
    -p means preserve permissions
    -i means display differences between source and destination
    -v means verbose output