Osama Bin Laden original ( Gary Meyil 2004 )

Drop a mail to me if you interested in buying 😉


Android AppWidget TableLayout

As most developers have found out, appwidgets break the normal rules when it comes to widget development.
Due to the abstract class ( appwidgetProvider ) and the updating through RemoteViews

You’re quite limited in the use of the different layout controls that are available.
namely :

  • FrameLayout
  • LinearLayout
  • RelativeLayout

So how do we get a table layout, that automatically expands or fills the available space?

The answer is clever use of of the weight attributes of linearLayout and the children components.
Here is an example of a timetable.

9 – 6 / Mon – friday.

Note* i have an image up the top right, you may wont to replace this with something else!

Scroll to the end for an example on how to loop through the cells

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent" android:layout_height="fill_parent"
	android:padding="0px" android:orientation="vertical">
	
	<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
		android:orientation="horizontal" android:layout_width="fill_parent"
		android:layout_margin="0px" android:layout_height="wrap_content">

		<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
			android:src="@drawable/ul"
			android:layout_width="fill_parent"
  			android:layout_height="wrap_content"
  			android:layout_weight="1"
  			android:layout_marginTop="6dp"
  			android:adjustViewBounds="true"
  			android:maxHeight="30px"/>

		<TextView xmlns:android="http://schemas.android.com/apk/res/android"
			android:layout_width="fill_parent" android:layout_height="wrap_content"
			android:layout_weight="1" android:text="Mon" android:gravity="center"
		/>

		<TextView xmlns:android="http://schemas.android.com/apk/res/android"
			android:layout_width="fill_parent" android:layout_height="wrap_content"
			android:layout_weight="1" android:text="Tue" android:gravity="center"
		/>

		<TextView xmlns:android="http://schemas.android.com/apk/res/android"
			android:layout_width="fill_parent" android:layout_height="wrap_content"
			android:layout_weight="1" android:text="Wed" android:gravity="center"
		/>

		<TextView xmlns:android="http://schemas.android.com/apk/res/android"
			android:layout_width="fill_parent" android:layout_height="wrap_content"
			android:layout_weight="1" android:text="Thu" android:gravity="center"
		/>

		<TextView xmlns:android="http://schemas.android.com/apk/res/android"
			android:layout_width="fill_parent" android:layout_height="wrap_content"
			android:layout_weight="1" android:text="Fri" android:gravity="center"
		/>

	</LinearLayout>

	<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
		android:orientation="vertical" android:layout_width="fill_parent"
		android:layout_height="fill_parent"
		android:layout_margin="0px" android:layout_weight="1.0" android:id="@+id/mainTable">	

		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
			android:orientation="horizontal" android:layout_width="match_parent"
			android:layout_height="wrap_content" android:layout_weight="1.0">

			<TextView xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:gravity="center" android:layout_weight="1" android:text="09:00" />

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/mon9"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/ue9"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/wed9"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/hu9"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/fri9"/>

		</LinearLayout>

		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
			android:orientation="horizontal" android:layout_width="match_parent"
			android:layout_height="wrap_content" android:layout_weight="1.0">

			<TextView xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:gravity="center" android:layout_weight="1" android:text="10:00" />

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/mon10"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/ue10"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/wed10"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/hu10"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/fri10"/>

		</LinearLayout>

		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
			android:orientation="horizontal" android:layout_width="match_parent"
			android:layout_height="wrap_content" android:layout_weight="1.0">

			<TextView xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:gravity="center" android:layout_weight="1" android:text="11:00" />

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/mon11"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/ue11"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/wed11"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/hu11"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1"android:id="@+id/fri11"/>

		</LinearLayout>

		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
			android:orientation="horizontal" android:layout_width="match_parent"
			android:layout_height="wrap_content" android:layout_weight="1.0">

			<TextView xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:gravity="center" android:layout_weight="1" android:text="12:00" />

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/mon12"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/ue12"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/wed12"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/hu12"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/fri12"/>

		</LinearLayout>

		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
			android:orientation="horizontal" android:layout_width="match_parent"
			android:layout_height="wrap_content" android:layout_weight="1.0">

			<TextView xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:gravity="center" android:layout_weight="1" android:text="13:00" />

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/mon13"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/ue13"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/wed13"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/hu13"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/fri13"/>

		</LinearLayout>

		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
			android:orientation="horizontal" android:layout_width="match_parent"
			android:layout_height="wrap_content" android:layout_weight="1.0">

			<TextView xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:gravity="center" android:layout_weight="1" android:text="14:00" />

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/mon14"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/ue14"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/wed14"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/hu14"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/fri14"/>

		</LinearLayout>

		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
			android:orientation="horizontal" android:layout_width="match_parent"
			android:layout_height="wrap_content" android:layout_weight="1.0">

			<TextView xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:gravity="center" android:layout_weight="1" android:text="15:00" />

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/mon15"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/ue15"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/wed15"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/hu15"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/fri15"/>

		</LinearLayout>

		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
			android:orientation="horizontal" android:layout_width="match_parent"
			android:layout_height="wrap_content" android:layout_weight="1.0">

			<TextView xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:gravity="center" android:layout_weight="1" android:text="16:00" />

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/mon16"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/thu17"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/wed16"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/hu16"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/fri16"/>

		</LinearLayout>

		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
			android:orientation="horizontal" android:layout_width="match_parent"
			android:layout_height="wrap_content" android:layout_weight="1.0">

			<TextView xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:gravity="center" android:layout_weight="1" android:text="17:00" />

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/mon17"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/ue17"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/wed17"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/thu17"/>

			<Button xmlns:android="http://schemas.android.com/apk/res/android"
				android:layout_width="fill_parent" android:layout_height="fill_parent"
				android:layout_weight="1" android:id="@+id/fri17"/>

		</LinearLayout>

	</LinearLayout>

</LinearLayout>

And just in case your wondering how you can easily loop through them

RemoteViews views = new RemoteViews( context.getPackageName() , R.layout.widget );

for ( int i = 9 ; i < 18 ; i++ )
{
	try
	{
	        int monid = R.id.class.getField( "mon" + i ).getInt( 0 );
		views.setOnClickPendingIntent( monid , this.createOnClickPendingIntent( context ) );

		int tueid = R.id.class.getField( "tue" + i ).getInt( 0 );
		views.setOnClickPendingIntent( tueid , this.createOnClickPendingIntent( context ) );

		int wedid = R.id.class.getField( "wed" + i ).getInt( 0 );
		views.setOnClickPendingIntent( wedid , this.createOnClickPendingIntent( context ) );

		int thuid = R.id.class.getField( "thu" + i ).getInt( 0 );
		views.setOnClickPendingIntent( thuid , this.createOnClickPendingIntent( context ) );

		int friid = R.id.class.getField( "fri" + i ).getInt( 0 );
		views.setOnClickPendingIntent( friid , this.createOnClickPendingIntent( context ) );

		Log.e( "done" , "Hour : " + i );
	}
	catch ( Exception k )
	{
		Log.e( "ffdsfdsfs" , "ERROR : " + k.getMessage() );
	}
}

Impending exams + Conscription

AW GAWD!!!!!

Haven’t done a tap and only 4 days to go. But to be fair it was an awesome day today!!!!
Any thing different,. No not really, the key to college is to turn up and nail the assignments.
it makes your life a lot easier and revision a lot easier.

As for all those who are waiting for updates on my side open source projects.
2 weeks now!


Android Custom Toast View from Service

Android documentation is something to be desired ;).

Given the following tutorial on creating Custom Toast Notifications.
Toast Notifications

They neglect to say how to do it from a service!

LayoutInflater inflater = ( LayoutInflater ) getSystemService( LAYOUT_INFLATER_SERVICE );
View layout = inflater.inflate( R.layout.toastview , null );

ImageView image = ( ImageView ) layout.findViewById( R.id.image );
image.setImageResource( R.drawable.meteor );
TextView text = ( TextView ) layout.findViewById( R.id.text );
text.setText( this.client.getLastError() );

Toast toast = new Toast( getApplicationContext() );
toast.setGravity( Gravity.CENTER_VERTICAL , 0 , 0 );
toast.setDuration( Toast.LENGTH_LONG );
toast.setView( layout );
toast.show();

Chrome Linux Save Flash Files

So i came across this handy scripts.

As part of some new offensive ;), or maybe just privacy concerns for the user.
Flash now right after beginning a FLV download
deletes the file from the /tmp directory

As it still has a lock on the file descriptor, it disappears right after the flash player closes.

Let the video finish streaming and then run this script
It will save the deleted flv videos with open file descriptors into the folder where you have run the script.

#!/usr/bin/perl
# Filename:	flashcache
# Author:	David Ljung Madison <DaveSource.com>
# See License:	http://MarginalHacks.com/License/
# Description:	Copy flash files in your browsers cache
# Dependencies:	Unix command 'lsof'
use strict;

##################################################
# Setup the variables
##################################################
my $PROGNAME = $0; $PROGNAME =~ s|.*/||;

my $LSOF = 'lsof';

my $FIND = 'flash';	# Find flash files
my $POST = 'flv';	# Postfix to save to

# Where we save files
#   %f is $FIND
#   %d is the next available number
#   %p is .$POST
my $DEST = "found%f.%d%p";

##################################################
# Usage
##################################################
sub fatal {
	foreach my $msg (@_) { print STDERR "[$PROGNAME] ERROR:  $msg\n"; }
	exit(-1);
}

sub usage {
	foreach my $msg (@_) { print STDERR "ERROR:  $msg\n"; }
	print STDERR <<USAGE;

Usage:\t$PROGNAME [-d]
  Copies deleted flash files currently open in your browser's cache
  -d             Set debug mode
  -find <str>    What to search for  [default $FIND]
  -post <str>    Postfix for saving files [default $POST]
  -dest <str>    Or just specify full destination [default $DEST]
                 (see the script for meanings of %f, %d, %p)

USAGE
	exit -1;
}

sub parseArgs {
	usage("You need to be on a system that uses /proc") unless -d '/proc';

	my $opt = {
		find => $FIND,
		post => $POST,
		dest => $DEST,
	};
	while (my $arg=shift(@ARGV)) {
		if ($arg =~ /^-h$/) { usage(); }
		if ($arg =~ /^-d$/) { $MAIN::DEBUG=1; next; }
		if ($arg =~ /^-find$/) { $opt->{find} = shift(@ARGV); next; }
		if ($arg =~ /^-post$/) { $opt->{post} = shift(@ARGV); next; }
		if ($arg =~ /^-dest$/) { $opt->{dest} = shift(@ARGV); next; }
		if ($arg =~ /^-/) { usage("Unknown option: $arg"); }
		usage("Too many files specified [$arg and $opt->{file}]") if $opt->{file};
	}

	usage("You need to specify a destination with -dest")
		unless $opt->{dest};
	
	usage("You need to specify something to search for with -find")
		unless $opt->{find};
	
	$opt;
}

sub debug {
	return unless $MAIN::DEBUG;
	foreach my $msg (@_) { print STDERR "[$PROGNAME] $msg\n"; }
}

##################################################
# Main code
##################################################
sub findFiles {
	my ($opt) = @_;
	my @found;
	# 'lsof /'  (The '/' just does files, no sockets, and is faster)
	open(LSOF,"$LSOF /|") || usage("Can't run [$LSOF]");
	while (<LSOF>) {
		next unless /delete/i;
		next unless /\Q$opt->{find}\E/i;
		chomp;
		# procname  pid  user   fd
		usage("Found it, can't parse it [$_]")
			unless /^\S+\s+(\d+)\s+\S+\s+(\d+)/;
		push(@found, [$1,$2]);
	}
	usage("Couldn't find any deleted cached $opt->{find} files")
		unless @found;
	@found;
}

sub procPath {
	my ($pid,$fd) = @_;
	my $path = "/proc/$pid";
	usage("Couldn't find $path") unless -d $path;
	$path .= '/fd';
	usage("Couldn't find $path") unless -d $path;
	$path .= "/$fd";
	usage("Couldn't read $path") unless -e $path;
	$path;
}

sub destPath {
	my ($opt) = @_;
	my $p = $opt->{dest};
	$p =~ s/%f/\Q$opt->{find}\E/g;
	$p =~ s/%p/.\Q$opt->{post}\E/g;
	my $num = 0;
	my $path;
	do {
		$path = $p;  $num++;
		$path =~ s/%d/$num/g;
	} until ! -f $path;
	$path;
}

sub main {
	my $opt = parseArgs();
	
	my @found = findFiles($opt);
	foreach my $found ( @found ) {
		my $src = procPath(@$found);
		my $dest = destPath($opt);
		print "$src -> $dest\n";
		system("/bin/cp",$src,$dest);
	}
}
main();