ruboto/ruboto

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

Summary

Maintainability
A
1 hr
Test Coverage
require 'ruboto/activity'
require 'ruboto/stack'

module Ruboto::Activity::Reload
  import org.ruboto.Log

  def onResume
    Log.d 'Ruboto::Activity::Reload onResume'
    super

    @ruboto_activity_reload_receiver = ReloadReceiver.new(self)
    filter = android.content.IntentFilter.new(android.content.Intent::ACTION_VIEW)
    registerReceiver(@ruboto_activity_reload_receiver, filter)
    Log.d 'Ruboto::Activity::Reload registered reload receiver'
  rescue Exception => e
    Log.e "Exception registering reload listener: #{e.message}"
    Log.e e.backtrace.join("\n")
  end

  def onPause
    super
    unregisterReceiver(@ruboto_activity_reload_receiver)
    @ruboto_activity_reload_receiver = nil
    Log.d 'Ruboto::Activity::Reload unregistered reload receiver'
  rescue Exception => e
    Log.e "Exception unregistering reload listener: #{e.message}"
    Log.e e.backtrace.join("\n")
  end

  def ruboto_activity_reload(scripts)
    Log.d "Got reload intent: #{scripts}"
  end

  class ReloadReceiver < android.content.BroadcastReceiver
    def initialize(activity)
      super()
      @activity = activity
    end

    # FIXME(uwe):  I would like to receive a string array,
    #              but have not found a way to do that.
    def onReceive(context, reload_intent)
      Log.d "Got reload intent: #{reload_intent.inspect}"
      file_string = reload_intent.get_string_extra('reload')
      if file_string
        scripts_dir = @activity.getExternalFilesDir(nil).absolute_path + '/scripts'
        files = file_string.split(/(?<!&);/).map { |f| f.gsub(/&(.)/) { |m| m[1] } }
        with_large_stack(size: 256) do
          files.each do |file|
            Log.d "load file: #{scripts_dir}/#{file}"
            load "#{scripts_dir}/#{file}"
          end
        end
        Log.d 'restart activity'
        if @activity.intent.action == android.content.Intent::ACTION_MAIN ||
            @activity.intent.action == android.hardware.usb.UsbManager::ACTION_USB_DEVICE_ATTACHED
          restart_intent = android.content.Intent.new(@activity.intent).
              setAction(android.content.Intent::ACTION_VIEW)
        else
          restart_intent = @activity.intent
        end
        @activity.finish
        @activity.startActivity(restart_intent)
        Log.d 'activity restarted'
      end
      Log.d 'reload complete.'
      true
    rescue Exception => e
      Log.e "Exception handling reload broadcast: #{e.message}"
      Log.e e.backtrace.join("\n")
    end
  end

end