package com.patloew.rxlocationsample; import android.location.Address; import android.location.Location; import android.os.Bundle; import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; import android.view.Menu; import android.view.MenuItem; import android.widget.TextView; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GoogleApiAvailability; import com.mikepenz.aboutlibraries.Libs; import com.mikepenz.aboutlibraries.LibsBuilder; import com.patloew.rxlocation.RxLocation; import java.text.DateFormat; import java.util.Date; import java.util.concurrent.TimeUnit; /* Copyright 2016 Patrick Löwenstein * * 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. */ public class MainActivity extends AppCompatActivity implements MainView { private static final DateFormat DATE_FORMAT = DateFormat.getDateTimeInstance(); private TextView lastUpdate; private TextView locationText; private TextView addressText; private RxLocation rxLocation; private MainPresenter presenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lastUpdate = (TextView) findViewById(R.id.tv_last_update); locationText = (TextView) findViewById(R.id.tv_current_location); addressText = (TextView) findViewById(R.id.tv_current_address); rxLocation = new RxLocation(this); rxLocation.setDefaultTimeout(15, TimeUnit.SECONDS); presenter = new MainPresenter(rxLocation); } @Override protected void onStart() { super.onStart(); presenter.attachView(this); } @Override protected void onResume() { super.onResume(); checkPlayServicesAvailable(); } private void checkPlayServicesAvailable() { final GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance(); final int status = apiAvailability.isGooglePlayServicesAvailable(this); if(status != ConnectionResult.SUCCESS) { if(apiAvailability.isUserResolvableError(status)) { apiAvailability.getErrorDialog(this, status, 1).show(); } else { Snackbar.make(lastUpdate, "Google Play Services unavailable. This app will not work", Snackbar.LENGTH_INDEFINITE).show(); } } } @Override protected void onStop() { super.onStop(); presenter.detachView(); } @Override protected void onDestroy() { super.onDestroy(); MyApplication.getRefWatcher().watch(presenter); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if(item.getItemId() == R.id.menu_licenses) { new LibsBuilder() .withFields(Libs.toStringArray(R.string.class.getFields())) .withActivityStyle(Libs.ActivityStyle.LIGHT_DARK_TOOLBAR) .withActivityTitle("Open Source Licenses") .withLicenseShown(true) .start(this); return true; } return false; } // View Interface @Override public void onLocationUpdate(Location location) { lastUpdate.setText(DATE_FORMAT.format(new Date())); locationText.setText(location.getLatitude() + ", " + location.getLongitude()); } @Override public void onAddressUpdate(Address address) { addressText.setText(getAddressText(address)); } @Override public void onLocationSettingsUnsuccessful() { Snackbar.make(lastUpdate, "Location settings requirements not satisfied. Showing last known location if available.", Snackbar.LENGTH_INDEFINITE) .setAction("Retry", view -> presenter.startLocationRefresh()) .show(); } private String getAddressText(Address address) { String addressText = ""; final int maxAddressLineIndex = address.getMaxAddressLineIndex(); for(int i=0; i<=maxAddressLineIndex; i++) { addressText += address.getAddressLine(i); if(i != maxAddressLineIndex) { addressText += "\n"; } } return addressText; } }