org.physical_web.physicalweb.MainActivity.java Source code

Java tutorial

Introduction

Here is the source code for org.physical_web.physicalweb.MainActivity.java

Source

/*
 * Copyright 2014 Google Inc. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.physical_web.physicalweb;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothManager;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

/**
 * The main entry point for the app.
 */

public class MainActivity extends Activity {
    private static final String TAG = MainActivity.class.getSimpleName();
    private static final int REQUEST_ENABLE_BT = 0;
    private static final int REQUEST_LOCATION = 1;
    private static final String NEARBY_BEACONS_FRAGMENT_TAG = "NearbyBeaconsFragmentTag";
    private static final String SETTINGS_FRAGMENT_TAG = "SettingsFragmentTag";
    private static final String BLOCKED_URLS_FRAGMENT_TAG = "BlockedUrlsFragmentTag";
    private static final String ABOUT_FRAGMENT_TAG = "AboutFragmentTag";
    private static final String DEMOS_FRAGMENT_TAG = "DemosFragmentTag";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Utils.setSharedPreferencesDefaultValues(this);
        PermissionCheck.getInstance().setCheckingPermissions(false);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    /**
     * Called when a menu item is tapped.
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        // If the about menu item was selected
        case R.id.action_about:
            showAboutFragment();
            return true;
        // If the settings menu item was selected
        case R.id.action_settings:
            showSettingsFragment();
            return true;
        case R.id.block_settings:
            showBlockedFragment();
            return true;
        case R.id.action_demos:
            showDemosFragment();
            return true;
        // If the action bar up button was pressed
        case android.R.id.home:
            getFragmentManager().popBackStack();
            getActionBar().setDisplayHomeAsUpEnabled(false);
        }
        return super.onOptionsItemSelected(item);
    }

    /**
     * Ensures Bluetooth is available on the beacon and it is enabled. If not,
     * displays a dialog requesting user permission to enable Bluetooth.
     */
    private void checkPermissions(BluetoothAdapter bluetoothAdapter) {
        // Acquire lock
        PermissionCheck.getInstance().setCheckingPermissions(true);
        if (!bluetoothAdapter.isEnabled()) {
            Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
            return;
        }
        ensureLocationPermissionIsEnabled();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.d(TAG, "onActivityResult");
        if (requestCode == REQUEST_ENABLE_BT && resultCode == -1) {
            ensureLocationPermissionIsEnabled();
            return;
        }
        Toast.makeText(this, getString(R.string.bt_on), Toast.LENGTH_LONG).show();
        finish();
    }

    private void ensureLocationPermissionIsEnabled() {
        if (Build.VERSION.SDK_INT >= 23 && ContextCompat.checkSelfPermission(this,
                android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                    new String[] { android.Manifest.permission.ACCESS_COARSE_LOCATION }, REQUEST_LOCATION);
            return;
        }
        PermissionCheck.getInstance().setCheckingPermissions(false);
        finishLoad();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
        case REQUEST_LOCATION: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                PermissionCheck.getInstance().setCheckingPermissions(false);
            } else {
                Toast.makeText(getApplicationContext(), getString(R.string.loc_permission), Toast.LENGTH_LONG)
                        .show();
                finish();
            }
            break;
        }
        default:
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        // Lock to prevent onResume from running until all permissions are granted
        if (!PermissionCheck.getInstance().isCheckingPermissions()) {
            Log.d(TAG, "resumed MainActivity");
            BluetoothManager btManager = (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);
            BluetoothAdapter btAdapter = btManager != null ? btManager.getAdapter() : null;
            if (btAdapter == null) {
                Toast.makeText(getApplicationContext(), R.string.error_bluetooth_support, Toast.LENGTH_LONG).show();
                finish();
                return;
            }
            if (Utils.checkIfUserHasOptedIn(this)) {
                Log.d(TAG, "checkingPermissions");
                checkPermissions(btAdapter);
            } else {
                // Show the oob activity
                Intent intent = new Intent(this, OobActivity.class);
                startActivity(intent);
            }
        }
    }

    private void finishLoad() {
        Intent intent = new Intent(this, ScreenListenerService.class);
        startService(intent);
        NearbyBeaconsFragment nearbyBeaconsFragment = (NearbyBeaconsFragment) getFragmentManager()
                .findFragmentByTag(NEARBY_BEACONS_FRAGMENT_TAG);
        if (nearbyBeaconsFragment != null) {
            nearbyBeaconsFragment.restartScan();
        } else {
            showFragment(new NearbyBeaconsFragment(), NEARBY_BEACONS_FRAGMENT_TAG, false);
        }
    }

    /**
     * Show the fragment to configure the app.
     */
    private void showSettingsFragment() {
        showFragment(new SettingsFragment(), SETTINGS_FRAGMENT_TAG, true);
    }

    /**
     * Show the fragment displaying information about this application.
     */
    private void showAboutFragment() {
        showFragment(new AboutFragment(), ABOUT_FRAGMENT_TAG, true);
    }

    /**
     * Show the fragment displaying the blocked URLs.
     */
    private void showBlockedFragment() {
        showFragment(new BlockedFragment(), BLOCKED_URLS_FRAGMENT_TAG, true);
    }

    /**
     * Show the fragment displaying the demos.
     */
    private void showDemosFragment() {
        showFragment(new DemosFragment(), DEMOS_FRAGMENT_TAG, true);
    }

    @SuppressLint("CommitTransaction")
    private void showFragment(Fragment newFragment, String fragmentTag, boolean addToBackStack) {
        FragmentTransaction transaction = getFragmentManager().beginTransaction()
                .setCustomAnimations(R.animator.fade_in_and_slide_up_fragment, R.animator.fade_out_fragment,
                        R.animator.fade_in_activity, R.animator.fade_out_fragment)
                .replace(R.id.main_activity_container, newFragment, fragmentTag);
        if (addToBackStack) {
            transaction.addToBackStack(null);
        }
        transaction.commit();
    }
}