GithubHelp home page GithubHelp logo

mango's Introduction

Mango

Android CI Build Status

Attendance App using Estimote Proximity Beacon.

Prototype

  • Full Ui here
  • interactive UI Dosen here
  • interactive UI Mahasiswa here

Document

Add Proximity SDK

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    // ...

    // add this:
    implementation 'com.estimote:proximity-sdk:1.0.4'
    // for the latest version, see the CHANGELOG and replace "1.0.4"
    // https://github.com/Estimote/Android-Proximity-SDK/blob/master/CHANGELOG.md

    implementation 'com.estimote:mustard:0.2.1'

    // for compatibility with Android 10, also add:
    implementation 'com.estimote:scanning-plugin:0.25.4'
}

Set up Estimote Cloud credentials

        // add this:
        EstimoteCloudCredentials cloudCredentials =
            new EstimoteCloudCredentials("APP ID", "APP TOKEN");

Create a Proximity Observer object

    // 1. Add a property to hold the Proximity Observer
        private ProximityObserver proximityObserver;

    // 2. Create the Proximity Observer
            this.proximityObserver =
                new ProximityObserverBuilder(getApplicationContext(), cloudCredentials)
                    .onError(new Function1<Throwable, Unit>() {
                        @Override
                        public Unit invoke(Throwable throwable) {
                            Log.e("app", "proximity observer error: " + throwable);
                            return null;
                        }
                    })
                    .withBalancedPowerMode()
                    .build();

Define Proximity Zones

Time to tell our Proximity Observer what enter/exit events we’re interested in! But first, some theory:

Tags and attachments

Chance is, knowing when the user enters range of beacon 1b4fe is not that useful in and on itself. However, if your app somehow knows that beacon 1b4fe is placed on Peter’s desk … “In range of beacon 1b4fe” suddenly means “close to Peter’s desk”. In other words, most of the time, proximity to beacons only makes sense if you can give your beacons some meaning. That’s what beacon tags and attachments are for … an easy way for you to attach some extra data/meaning to a beacon, for example:

    "identifier": "1b4fe",
    "tag": "desks",
    "attachments": {
       "desk-owner": "Peter"
     }

With such a setup, it’s now easy to say “monitor proximity to desks”, and also figure out whose desk we’re close to. And since tags and attachments are stored in Estimote Cloud, it’s also easy to change the setup without having to change the app’s code. For example, if sombebody else takes Peter’s desk, just change the “desk-owner” to a new one. If your app was coded to welcome the owner at their desk by their name, it’ll now start using the new one.

Set up tags and attachments

With the theory out of the way, let’s set up some tags and attachments. Go to cloud.estimote.com, select one of your beacons, and click “Edit”. Then:

  • to set up a tag: Click on “Tags”, “Create New Tag”, enter “desks”, and click “Add”.
  • to set up attachments: On the left side, select “Beacon Attachment”. Then, add a “desk-owner” key with value set to “Peter”.

Finish with the “Save Changes” at the bottom. Ta-da, we’ve just set up our first beacon! Repeat these steps for another beacon. Use the same “desks” tag, but this time, set the “desk-owner” to “Alex”.

Create Proximity Zone objects

Now we can move on to creating Proximity Zone objects in our app. Back to the future MainActivity!

    this.proximityObserver = // ...
    
    // add this below:
    ProximityZone zone = new ProximityZoneBuilder()
        .forTag("desks")
        .inNearRange()
        .onEnter(new Function1<ProximityZoneContext, Unit>() {
            @Override
            public Unit invoke(ProximityZoneContext context) {
                String deskOwner = context.getAttachments().get("desk-owner");
                Log.d("app", "Welcome to " + deskOwner + "'s desk");
                return null;
            }
        })
        .onExit(new Function1<ProximityZoneContext, Unit>() {
            @Override
            public Unit invoke(ProximityZoneContext context) {
                Log.d("app", "Bye bye, come again!");
                return null;
            }
        })
        .build();

Note that for this setup to work, you need to spread the beacons apart a good few meters. If they overlap, then moving from one beacon to the other is considered moving within the zone, and it won’t trigger additional enter/exit actions. If you want to know about movements inside a zone spanned by multiple overlapping beacons, you can use the “onContextChange” action instead. Think about it as: I’m still in the same desks zone (hence no new enter/exits), but my context (which specific desks are in range) has changed (hence the “onContextChange” action).

    ProximityZone zone = new ProximityZoneBuilder()
        // ...
        .onContextChange(new Function1<Set<? extends ProximityZoneContext>, Unit>() {
            @Override
            public Unit invoke(Set<? extends ProximityZoneContext> contexts) {
                List<String> deskOwners = new ArrayList<>();
                for (ProximityZoneContext context : contexts) {
                    deskOwners.add(context.getAttachments().get("desk-owner"));
                }
                Log.d("app", "In range of desks: " + deskOwners);
                return null;
            }
        })

Here’s how this would work in an overlapping scenario:

    # move in range of "Peter's desk" beacon
    # this is also when the "enter" action would get called
    Nearby desks: [Peter]
    # move in range of both beacons
    Nearby desks: [Peter, Alex]
    # move out of range of "Peter's desk", but still in range of "Alex's desk"
    Nearby desks: [Alex]
    # move out of range of both beacons
    # this is also when the "exit" action would get called
    Nearby desks: []

About the Proximity Zone range

    ProximityZone innerZone = new ProximityZoneBuilder()
        .forTag("treasure")
        .inCustomRange(3.0)
        .create();
    
    ProximityZone outerZone = new ProximityZoneBuilder()
        .forTag("treasure")
        .inCustomRange(9.0)
        .create();

Start proximity observation

We’re almost there! Before we start proximity observations, there’s just one more thing left to do.

Request location permissions

Performing a Bluetooth scan on Android requires the app to obtain an ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission from the user. There’s a tutorial on Android Developer Portal which shows how to do that: Requesting Permissions at Run Time. However, to get started quickly, we’ll use our little helper library, com.estimote:mustard, to check and request the appropriate permissions with just a few lines of code. As an added bonus, it’ll also check if all the other requirements are met—for example, if Bluetooth is available and turned on.

    RequirementsWizardFactory
        .createEstimoteRequirementsWizard()
        .fulfillRequirements(this,
        // onRequirementsFulfilled
        new Function0<Unit>() {
            @Override public Unit invoke() {
                Log.d("app", "requirements fulfilled");
                proximityObserver.startObserving(zone);
                return null;
            }
        },
        // onRequirementsMissing
        new Function1<List<? extends Requirement>, Unit>() {
            @Override public Unit invoke(List<? extends Requirement> requirements) {
                Log.e("app", "requirements missing: " + requirements);
                return null;
            }
        },
        // onError
        new Function1<Throwable, Unit>() {
            @Override public Unit invoke(Throwable throwable) {
                Log.e("app", "requirements error: " + throwable);
                return null;
            }
        });

Tech 👨‍💻

Task List

  • Multi Role Login

LEGAL

Copyright 2019-2020 Autumn Leaves Program Studi D3 Rekayasa Perangkat Lunak Aplikasi Universitas Telkom Bandung. Don't upload any fork ,source on any other paltform.

Who Supported This Project (All lecturers of D3IF Telkom University)

  • Rahmadi Wijaya, S.Si., M.T. (Head of Study Program)
  • Gandeva Bayu Satrya, ST., MT., Ph.D. (Advisor 1)
  • Hariandi Maulid , S.T., M.Sc
  • Amir Hasanudin Fauzi, S.T., M.T.
  • Fat'hah Noor Prawita, S.T., M.T.
  • Hariandi Maulid, S.T., M.Sc.
  • Hetti Hidayati, S.Kom., M.T.
  • Indra Azimi, S.T., M.T.
  • Rizza Indah Mega Mandasari, S.Kom., M.T.
  • Tri Brotoharsono, S.T., M.T.

mango's People

Contributors

febydahlan avatar fiqryq avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

mango's Issues

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.