#!/usr/bin/env ruby class Build attr_reader :android_sdk_path, :name, :pkg, :www, :path def initialize(*a) @android_sdk_path, @name, @pkg, @www, @path = a end # runs the build script def run build_jar create_android generate_manifest copy_libs add_name_to_strings write_java end # removes local.properties and recreates based on android_sdk_path # then generates framework/phonegap.jar def build_jar `rm framework/local.properties` if File.exists? 'framework/local.properties' `rm framework/phonegap.jar` if File.exists? 'framework/phonegap.jar' `rm framework/phonegap.js` if File.exists? 'framework/phonegap.js' `ECHO 'sdk.dir=#{ @android_sdk_path }' > framework/local.properties` `cd framework; ant jar` end # runs android create project # TODO need to allow more flexible SDK targetting # TODO validate Android SDK def create_android `#{ @android_sdk_path }/tools/android create project -t 5 -k #{ @pkg } -a #{ @name } -n #{ @name } -p #{ @path }` `mkdir -p #{ @path }/assets/www` `cp -R #{ @www } #{ @path }/assets/www` end # creates an AndroidManifest.xml for the project def generate_manifest manifest = "" open('framework/AndroidManifest.xml', 'r') do |old| manifest = old.read manifest.gsub! 'android:versionCode="5"', 'android:versionCode="1"' manifest.gsub! 'package="com.phonegap"', "package=\"#{ @pkg }\"" manifest.gsub! 'android:name=".StandAlone"', "android:name=\".#{ @name }\"" manifest.gsub! 'android:minSdkVersion="5"', 'android:minSdkVersion="3"' end open("#{ @path }/AndroidManifest.xml", 'w') { |x| x.puts manifest } end # copies stuff from framework into the project # TODO need to allow for www import inc icon def copy_libs `cp framework/phonegap.jar #{ @path }/libs` `cp framework/res/values/strings.xml #{ @path }/res/values/strings.xml` `cp framework/res/layout/main.xml #{ @path }/res/layout/main.xml` `cp framework/res/layout/preview.xml #{ @path }/res/layout/preview.xml` %w(drawable-hdpi drawable-ldpi drawable-mdpi).each do |e| `cp framework/res/drawable/icon.png #{ @path }/res/#{ e }/icon.png` end `cp -R example #{ @path }/assets` `mv #{ @path }/assets/example #{ @path }/assets/www` end # puts app name in strings def add_name_to_strings x = " #{ @name } Snap " open("#{ @path }/res/values/strings.xml", 'w') do |f| f.puts x.gsub(' ','') end end # this is so fucking unholy yet oddly beautiful # not sure if I should thank Ruby or apologize for this abusive use of string interpolation def write_java j = " package #{ @pkg }; import android.app.Activity; import android.os.Bundle; import com.phonegap.*; public class #{ @name } extends DroidGap { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.loadUrl(\"file:///android_asset/www/index.html\"); } } " dir = "#{ @path }/src/#{ @pkg.gsub '.', '/' }"; cls = "#{ @name }.java" pth = File.join(dir,cls) open(pth,'w') { |f| f.puts j.gsub(' ','') } end # end if ARGV.length == 5 Build.new(*ARGV).run else puts <<-EOF DroidGap: PhoneGap/Android Project Generator ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Creates a fresh app for hybrid mobile web hacking. Delicious robot! Usage: ./droidgap Params: android_sdk_path ... The path to your Android SDK install. name ............... The name of your application. package_name ....... The name of your package (For example: com.nitobi.demo) www ................ The path to your www folder. (Wherein your HTML, CSS and JS app is.) path ............... The path to generate the application. EOF end