Criar uma cerca

Um limite define uma ou mais condições contextuais às quais seu app pode reagir. Quando o estado de um limite muda, seu app recebe um callback.

Há dois tipos de limites: limites primitivos, que representam o conjunto básico de sinais de contexto, e combinações de limite, que combinam vários limites primitivos com o uso de operadores booleanos. Todos os limites são instâncias de AwarenessFence.

Criar um limite primitivo

Os limites primários, que representam o conjunto básico de sinais de contexto, são definidos no pacote awareness.fence. O exemplo a seguir mostra a criação de um limite simples que é TRUE quando a atividade detectada do usuário é WALKING, caso contrário, FALSE:

AwarenessFence walkingFence = DetectedActivityFence.during(DetectedActivityFence.WALKING);

No exemplo anterior, o DetectedActivityFence foi criado por uma chamada para during, o que significa que o limite está no estado TRUE sempre que o usuário está WALKING.

Reagir a transições

Cada tipo de limite primitivo, com exceção de TimeFence, também pode ser acionado momentaneamente quando o estado do contexto muda. Por exemplo, você pode definir um DetectedActivityFence para ser acionado momentaneamente quando um usuário for starting ou stopping uma atividade. Os limites de transição ficam no estado TRUE por alguns segundos antes de virarem FALSE novamente.

Criar um limite de combinação

Os limites de combinação combinam vários tipos de limite primitivos com o uso de operadores booleanos. O exemplo a seguir mostra a criação de um limite de combinação que é ativado quando o usuário anda e os fones de ouvido estão conectados:

// Create the primitive fences.
AwarenessFence walkingFence = DetectedActivityFence.during(DetectedActivityFence.WALKING);
AwarenessFence headphoneFence = HeadphoneFence.during(HeadphoneState.PLUGGED_IN);

// Create a combination fence to AND primitive fences.
AwarenessFence walkingWithHeadphones = AwarenessFence.and(
      walkingFence, headphoneFence
);

Árvores aninhadas de AND, OR e NOT são válidas. Portanto, qualquer combinação booleana de limites é possível. O exemplo a seguir mostra um limite que é acionado quando um usuário se move a mais de 100 metros do local atual ou mais de uma hora se passou desde o momento atual.

double currentLocationLat;  // current location latitude
double currentLocationLng;  // current location longitude
long nowMillis = System.currentTimeMillis();
long oneHourMillis = 1L * 60L * 60L * 1000L;

AwarenessFence orExample = AwarenessFence.or(
        AwarenessFence.not(LocationFence.in(
                currentLocationLat,
                currentLocationLng,
                100.0,
                100.0,
                0L)),
        TimeFence.inInterval(nowMillis + oneHourMillis, Long.MAX_VALUE));

Próxima etapa: registrar um limite.