Saturday, September 17, 2011

Testing internal C# methods in Visual Studio Express

Just add the following to AssemblyInfo.cs in the project under test:

   [assembly: InternalsVisibleTo("NameOfTestProject")]

Saturday, September 10, 2011

Building Android with Ant and External Libraries

Android seems set up by default to look in a folder called libs for libraries, so just drop your jars in there and it should just work!

Friday, September 2, 2011

Android Process Monitor

I have an app which needs to monitor whether another app is running or not. I used the following code:

    List runningAppProcessInfos =
((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)).getRunningAppProcesses();

and search the List of RunningAppProcessInfos for the process in question, after filtering out the running services. It works perfectly, except when a search for the process in question coincides with plugging the device into a usb charger (laptop in this case). For some reason, this code fails; the process I am interested in never stops running according to logcat, but it seems to be missing from the List as my app doesn't find it, so exits (part of the logic, not a crash).

Oh well, one to look out for...

Saturday, August 27, 2011

Copying files in Java


This is something I've never really done much of, but when I've seen snippets of code which do this I've always thought how ugly and cumbersome it looks:

    File srcFile = new File(sourceFilePath);
    File destFile = new File(destinationFilePath);
    FileInputStream in = new FileInputStream(srcFile);
    FileOutputStream out = new FileOutputStream(destFile);
    byte[] buf = new byte[2048];
    int len;
    while ((len = in.read(buf)) > 0)
    {
        try
        {
   out.write(buf, 0, len);
}
catch (Exception e)
{
}
    }
    out.flush();
    in.close();
    out.close();

etc...

But there is now, at last, an easier way:

    import java.nio.channels.FileChannel;
    ...
    File srcFile = new File(sourceFilePath);
    File destFile = new File(destinationFilePath);
    FileInputStream in = new FileInputStream(srcFile);
    FileOutputStream out = new FileOutputStream(destFile);
    FileChannel srcFileChannel = in.getChannel();
    FileChannel destFileChannel = out.getChannel();

    destFileChannel.transferFrom(srcFileChannel, 0, srcFileChannel.size());
    srcFileChannel.close();
    destFileChannel.close();
   ...

Sunday, August 7, 2011

Building Android with Ant

To create a build using an ant build.xml script, you'll need a local.properties file. This point to your sdk installation directory.

You can create this with the android tool like so:
    android update project --path .

Execute from your project's directory. The full stop is important!

Remember you'll need to add keystore and proguard if you want to sign/obfustcate etc:
    key.store=/path_to_keystore/keystore
    key.alias=key_store_alias
    proguard.dir=/path_to_proguard/lib (seems to use lib dir rather than bin)

(See here for more about signing and obfuscation)

Saturday, July 23, 2011

Debugging with Nunit and Visual Studio Express

It's possible to set breakpoints in unit tests in the freebie versions of MS Visual Studio:
  1. add a reference to the C:\Program Files\NUnit 2.5.10\bin\net-2.0\lib\nunit-console-runner.dll to your test project
  2. add the following class to your test project
  3. using System;
    namespace MyTests
    {
        class NUnitDebugRunner
        {
            [STAThread]
            static void Main(string[] args)
            {
                NUnit.ConsoleRunner.Runner.Main(args);
            }
        }
    }

  4. in the test project properties, under 'Application' set the output type as 'Windows Application and the Startup objects as the class created in the previous step. Under the debug tab, browse to the folder containing the csproj for the test project in the 'Working directory' field and put the name of the csproj file in the C'Command line arguments' field
  5. set the test project as the startup project
Now when you hit F5, any breakpoints in the tests will be hit.

Thanks to Blokley

Wednesday, July 20, 2011

Executing a script at startup

Having just reinstalled Linux Mint, I needed to install and setup Twonky media server again. Installing was easy with the supplied script, but to start the server (and kill it on shutdown - don't know if this is strictly necessary) you have to create a symbolic link in /etc/rc2.d which points to the twonky script in /etc/init.d and give it a name starting with Snn, where nn is a 2 digit number from 01 to 99:
    sudo ln -s /etc/init.d/twonkyserver /etc/rc2.dS99twonky


To kill the server, do the same in /etc/rc0.d but call the symbolic link Knn:
    sudo ln -s /etc/init.d/twonkyserver /etc/rc0.d/K99twonky