class Medic::Store

Public Class Methods

available?() click to toggle source
# File lib/medic/store.rb, line 22
def self.available?
  HKHealthStore.isHealthDataAvailable
end
hk_store() click to toggle source
# File lib/medic/store.rb, line 13
def self.hk_store
  @@hk_store
end
shared() click to toggle source
# File lib/medic/store.rb, line 7
def self.shared
  Dispatch.once { @@hk_store ||= HKHealthStore.new }
  Dispatch.once { @medic_store ||= new }
  @medic_store
end
unload() click to toggle source
# File lib/medic/store.rb, line 17
def self.unload
  @@hk_store = nil
  @medic_store = nil
end

Public Instance Methods

authorize(types, block=Proc.new) click to toggle source
# File lib/medic/store.rb, line 27
def authorize(types, block=Proc.new)
  share = Array(types[:share] || types[:write]).map{ |sym| object_type(sym) }
  read  = Array(types[:read]).map{ |sym| object_type(sym) }

  @@hk_store.requestAuthorizationToShareTypes(NSSet.setWithArray(share), readTypes: NSSet.setWithArray(read), completion: ->(success, error){
    block.call(success, error)
  })
end
authorized?(sym) click to toggle source
# File lib/medic/store.rb, line 36
def authorized?(sym)
  @@hk_store.authorizationStatusForType(object_type(sym)) == HKAuthorizationStatusSharingAuthorized
end
authorized_for?(sym)
Alias for: authorized?
biological_sex() { |invert, error| ... } click to toggle source
# File lib/medic/store.rb, line 43
def biological_sex
  error = Pointer.new(:object)
  sex = @@hk_store.biologicalSexWithError error
  if block_given?
    yield BIOLOGICAL_SEXES.invert[sex.biologicalSex], error[0]
  else
    BIOLOGICAL_SEXES.invert[sex.biologicalSex]
  end
end
blood_type() { |invert, error| ... } click to toggle source
# File lib/medic/store.rb, line 53
def blood_type
  error = Pointer.new(:object)
  blood = @@hk_store.bloodTypeWithError error
  if block_given?
    yield BLOOD_TYPES.invert[blood.bloodType], error[0]
  else
    BLOOD_TYPES.invert[blood.bloodType]
  end
end
date_of_birth() { |birthday, error| ... } click to toggle source
# File lib/medic/store.rb, line 63
def date_of_birth
  error = Pointer.new(:object)
  birthday = @@hk_store.dateOfBirthWithError error
  if block_given?
    yield birthday, error[0]
  else
    birthday
  end
end
delete(hk_object, block=Proc.new) click to toggle source
# File lib/medic/store.rb, line 73
def delete(hk_object, block=Proc.new)
  @@hk_store.deleteObject(hk_object, withCompletion: ->(success, error){
    block.call(success, error)
  })
end
Also aliased as: delete_object
delete_object(hk_object, block=Proc.new)
Alias for: delete
disable_all_background_delivery(block=Proc.new) click to toggle source
# File lib/medic/store.rb, line 117
def disable_all_background_delivery(block=Proc.new)
  @@hk_store.disableAllBackgroundDeliveryWithCompletion(->(success, error){
    block.call(success, error)
  })
end
disable_background_delivery(type, block=Proc.new) click to toggle source
# File lib/medic/store.rb, line 109
def disable_background_delivery(type, block=Proc.new)
  return disable_all_background_delivery(block) if type == :all
  @@hk_store.disableBackgroundDeliveryForType(object_type(type), withCompletion: ->(success, error){
    block.call(success, error)
  })
end
disable_background_delivery_for(type, block=Proc.new)
enable_background_delivery(type, frequency, block=Proc.new) click to toggle source
# File lib/medic/store.rb, line 102
def enable_background_delivery(type, frequency, block=Proc.new)
  @@hk_store.enableBackgroundDeliveryForType(object_type(type), frequency: update_frequency(frequency), withCompletion: ->(success, error){
    block.call(success, error)
  })
end
enable_background_delivery_for(type, frequency, block=Proc.new)
execute(query) click to toggle source

TODO: workout support addSamples:toWorkout:completion:

# File lib/medic/store.rb, line 92
def execute(query)
  @@hk_store.executeQuery(query)
end
Also aliased as: execute_query
execute_query(query)
Alias for: execute
is_authorized?(sym)
Alias for: authorized?
is_authorized_for?(sym)
Alias for: authorized?
save(hk_objects, block=Proc.new) click to toggle source
# File lib/medic/store.rb, line 80
def save(hk_objects, block=Proc.new)
  objs_array = hk_objects.is_a?(Array) ? hk_objects : [hk_objects]
  @@hk_store.saveObjects(objs_array.map{|obj| prepare_for_save(obj)}, withCompletion: ->(success, error){
    block.call(success, error)
  })
end
Also aliased as: save_object, save_objects
save_object(hk_objects, block=Proc.new)
Alias for: save
save_objects(hk_objects, block=Proc.new)
Alias for: save
stop(query) click to toggle source
# File lib/medic/store.rb, line 97
def stop(query)
  @@hk_store.stopQuery(query)
end
Also aliased as: stop_query
stop_query(query)
Alias for: stop

Private Instance Methods

prepare_for_save(sample) click to toggle source
# File lib/medic/store.rb, line 125
def prepare_for_save(sample)
  return sample if sample.kind_of? HKSample

  date = sample[:date] || NSDate.date
  start_date = sample[:start] || sample[:start_date] || date
  end_date = sample[:end] || sample[:end_date] || date
  metadata = sample[:metadata] || {}

  type = object_type(sample[:type] || sample[:sample_type] || sample[:quantity_type] || sample[:correlation_type] || sample[:category_type])

  case type
  when HKQuantityType
    quantity = HKQuantity.quantityWithUnit((sample_unit(sample[:unit]) || type.canonicalUnit), doubleValue: sample[:quantity])
    HKQuantitySample.quantitySampleWithType(type, quantity: quantity, startDate: start_date, endDate: end_date, metadata: metadata)
  when HKCorrelationType
    objects = (sample[:objects].is_a?(Array) ? sample[:objects] : [sample[:objects]]).map{|obj| prepare_for_save(obj)}
    HKCorrelation.correlationWithType(type, startDate: start_date, endDate: end_date, objects: objects, metadata: metadata)
  when HKCategoryType
    value = sleep_analysis(sample[:value]) # SleepAnalysis is the only category type at the moment
    HKCategorySample.categorySampleWithType(type, value: value, startDate: start_date, endDate: end_date, metadata: metadata)
  else
    # handle workouts
  end
end