ruboto/ruboto

View on GitHub
assets/app/src/main/resources/ruboto/service.rb

Summary

Maintainability
B
5 hrs
Test Coverage
require 'ruboto/base'
require 'ruboto/package'

#######################################################
#
# ruboto/service.rb
#
# Basic service set up.
#
#######################################################

java_import 'android.content.Context'
java_import 'org.ruboto.RubotoService'

module Ruboto
  module Context
    def start_ruboto_service(class_name = nil, options = nil, &block)
      if options.nil?
        if class_name.is_a?(Hash)
          options = class_name
          class_name = nil
        else
          options = {}
        end
      end
      
      # FIXME(uwe):  Deprecated.  Remove august 2014.
      if options[:class_name]
        puts "\nDEPRECATION: The ':class_name' option is deprecated.  Put the class name in the first argument instead."
        class_name_option = options.delete(:class_name)
        class_name ||= class_name_option
      end
      
      java_class = options.delete(:java_class) || RubotoService
      script_name = options.delete(:script)
      extras = options.delete(:extras)
      flags = options.delete(:flags)

      raise "Unknown options: #{options}" unless options.empty?
      
      if class_name.nil?
        if block_given?
          src_desc = source_descriptor(block)
          class_name =
              "#{java_class.name.split('::').last}_#{src_desc[0].split('/').last.gsub(/[.-]+/, '_')}_#{src_desc[1]}"
        else
          class_name = java_class.name.split('::').last
        end
      end

      class_name = class_name.to_s

      if Object.const_defined?(class_name)
        Object.const_get(class_name).class_eval(&block) if block_given?
      else
        Object.const_set(class_name, Class.new(&block))
      end

      i = android.content.Intent.new
      i.setClass self, java_class.java_class
      i.add_flags(flags) if flags
      i.putExtra(Ruboto::CLASS_NAME_KEY, class_name)
      i.putExtra(Ruboto::SCRIPT_NAME_KEY, script_name) if script_name
      extras.each { |k, v| i.putExtra(k.to_s, v) } if extras
      puts "starting Ruboto service: #{i.inspect}"
      self.startService i
      self
    end
    
    private

    def source_descriptor(src_proc)
      if (md = /^#<Proc:0x[0-9A-Fa-f-]+@(.+):(\d+)(?: \(lambda\))?>$/.match(src_proc.inspect))
        filename, line = md.captures
        return filename, line.to_i
      end
    end
  end
end

Context.class_eval do
  include Ruboto::Context
end