Skip to content

Commit

Permalink
data binding prototype
Browse files Browse the repository at this point in the history
  • Loading branch information
David Vávra committed Sep 19, 2015
1 parent 8338195 commit ba1157c
Show file tree
Hide file tree
Showing 9 changed files with 173 additions and 176 deletions.
15 changes: 8 additions & 7 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
apply plugin: 'com.android.application'
apply plugin: 'com.android.databinding'
apply plugin: 'android-apt'
apply plugin: 'io.fabric'

Expand All @@ -8,7 +9,7 @@ android {

defaultConfig {
applicationId "org.destil.gpsaveraging"
minSdkVersion 9
minSdkVersion 15
targetSdkVersion 23
}

Expand All @@ -21,12 +22,12 @@ android {
}

dependencies {
compile 'com.android.support:appcompat-v7:23.0.0'
compile 'com.android.support:design:23.0.0'
compile 'com.android.support:recyclerview-v7:23.0.0'
compile 'com.android.support:cardview-v7:23.0.0'
compile 'com.android.support:percent:23.0.0'
compile 'com.android.support:preference-v7:23.0.0'
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.android.support:design:23.0.1'
compile 'com.android.support:recyclerview-v7:23.0.1'
compile 'com.android.support:cardview-v7:23.0.1'
compile 'com.android.support:percent:23.0.1'
compile 'com.android.support:preference-v7:23.0.1'
compile 'com.google.android.gms:play-services-ads:7.8.0'
compile 'com.jakewharton:butterknife:7.0.1'
compile 'com.squareup:otto:1.3.8'
Expand Down
14 changes: 14 additions & 0 deletions app/src/main/java/org/destil/gpsaveraging/MainActivity.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
package org.destil.gpsaveraging;

import javax.inject.Inject;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.Menu;
import android.view.MenuItem;

import com.squareup.otto.Bus;
import org.destil.gpsaveraging.base.BaseActivity;
import org.destil.gpsaveraging.location.event.FirstFixEvent;
import org.destil.gpsaveraging.ui.activity.AboutActivity;
import org.destil.gpsaveraging.ui.fragment.MainFragment;
import org.destil.gpsaveraging.ui.activity.SettingsActivity;
Expand All @@ -17,6 +22,15 @@

public class MainActivity extends BaseActivity {

@Inject
Bus mBus;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
App.component().injectToMainActivity(this);
}

@Override
public Fragment getFragment() {
return new MainFragment();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,5 +24,5 @@ public interface AppComponent {

void injectToAverageLocationCardView(AverageLocationCardView averageLocationCardView);

void injetToMainFragment(MainFragment mainFragment);
void injectToMainFragment(MainFragment mainFragment);
}
2 changes: 2 additions & 0 deletions app/src/main/java/org/destil/gpsaveraging/ui/AdManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ public void load(AdView adView) {
builder.addKeyword("check in");
builder.addTestDevice("6E70B945F7D166EA14779C899463B8BC"); // My N7
builder.addTestDevice("197CB241DBFB335DD54A6D050DE58792"); // My N5
builder.addTestDevice("996EE7E77D7181208AF916072F5FFE4C"); // My N5#2
builder.addTestDevice("622AFF2BE01381DB65A2ACAE09D77ABD"); // Genymotion
adView.loadAd(builder.build());
}
}
Original file line number Diff line number Diff line change
@@ -1,27 +1,24 @@
package org.destil.gpsaveraging.ui.fragment;

import javax.inject.Inject;

import android.Manifest;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.FloatingActionButton;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.ScrollView;
import android.widget.TextView;

import com.google.android.gms.ads.AdView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import com.squareup.otto.Bus;
import com.squareup.otto.Subscribe;

import org.destil.gpsaveraging.App;
import org.destil.gpsaveraging.R;
import org.destil.gpsaveraging.base.BaseFragment;
import org.destil.gpsaveraging.data.Intents;
import org.destil.gpsaveraging.databinding.FragmentMainBinding;
import org.destil.gpsaveraging.location.GpsObserver;
import org.destil.gpsaveraging.location.event.CurrentLocationEvent;
import org.destil.gpsaveraging.location.event.FirstFixEvent;
Expand All @@ -32,15 +29,8 @@
import org.destil.gpsaveraging.measure.event.AveragedLocationEvent;
import org.destil.gpsaveraging.ui.AdManager;
import org.destil.gpsaveraging.ui.Animations;
import org.destil.gpsaveraging.ui.view.AverageLocationCardView;
import org.destil.gpsaveraging.ui.view.LocationCardView;
import org.destil.gpsaveraging.ui.view.Snackbar;

import javax.inject.Inject;

import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
import org.destil.gpsaveraging.ui.viewmodel.MainFragmentViewModel;
import permissions.dispatcher.NeedsPermission;
import permissions.dispatcher.RuntimePermissions;
import permissions.dispatcher.ShowsRationale;
Expand All @@ -50,26 +40,6 @@
*/
@RuntimePermissions
public class MainFragment extends BaseFragment {
@Bind(R.id.empty)
LinearLayout vEmpty;
@Bind(R.id.cards)
ScrollView vCards;
@Bind(R.id.fab)
FloatingActionButton vFab;
@Bind(R.id.ad)
AdView vAd;
@Bind(R.id.progress)
ProgressBar vProgress;
@Bind(R.id.status)
TextView vStatus;
@Bind(R.id.satellites)
TextView vSatellites;
@Bind(R.id.current_location)
LocationCardView vCurrentLocation;
@Bind(R.id.average_location)
AverageLocationCardView vAverageLocation;
@Bind(R.id.coordinator)
CoordinatorLayout vCoordinator;

@Inject
Bus mBus;
Expand All @@ -86,31 +56,30 @@ public class MainFragment extends BaseFragment {
@Inject
AdManager mAdManager;

private MainFragmentViewModel mViewModel;
private FragmentMainBinding mBinding;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_main, container, false);
ButterKnife.bind(this, view);
App.component().injetToMainFragment(this);
mBinding = FragmentMainBinding.inflate(inflater, container, false);
mViewModel = new MainFragmentViewModel();
mBinding.setViewModel(mViewModel);
App.component().injectToMainFragment(this);
mBus.register(this);
return view;
return mBinding.getRoot();
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mAdManager.load(vAd);
mAdManager.load(mBinding.ad);
}

@Override
public void onStart() {
super.onStart();
if (mGps.hasFix()) {
showCurrentLocation();
} else {
showWaitingForGps();
}
changeFab();
mViewModel.hasFix.set(mGps.hasFix());
observeGps();
MainFragmentPermissionsDispatcher.observeGpsWithCheck(this);
}
Expand All @@ -136,32 +105,32 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis

@Subscribe
public void onFirstFix(FirstFixEvent e) {
if (vCards.getVisibility() == View.GONE) {
vEmpty.setVisibility(View.GONE);
vAverageLocation.setVisibility(View.GONE);
mAnimations.showFromTop(vCards);
mAnimations.showFromTop(vFab);
mViewModel.hasFix.set(true);
if (mBinding.cards.getVisibility() == View.GONE) {
mBinding.averageLocation.setVisibility(View.GONE);
mAnimations.showFromTop(mBinding.cards);
mAnimations.showFromTop(mBinding.fab);
}
}

@Subscribe
public void onGpsNotAvailable(GpsNotAvailableEvent e) {
Snackbar.show(vCoordinator, R.string.gps_not_available);
Snackbar.show(mBinding.coordinator, R.string.gps_not_available);
}

@Subscribe
public void onSatellites(SatellitesEvent e) {
vSatellites.setText(getString(R.string.satellites_info, e.getCount()));
mViewModel.satelliteInfo.set(getString(R.string.satellites_info, e.getCount()));
}

@Subscribe
public void onCurrentLocation(CurrentLocationEvent e) {
vCurrentLocation.updateLocation(e.getLocation());
mBinding.currentLocation.updateLocation(e.getLocation());
}

@Subscribe
public void onAverageLocation(AveragedLocationEvent e) {
vAverageLocation.updateLocation(e.getLocation());
mBinding.averageLocation.updateLocation(e.getLocation());
}

@OnClick(R.id.fab)
Expand All @@ -171,7 +140,6 @@ public void onFabClicked(View view) {
} else {
startAveraging();
}
changeFab();
}


Expand All @@ -182,73 +150,51 @@ void observeGps() {

@ShowsRationale(Manifest.permission.ACCESS_FINE_LOCATION)
void showRationaleForLocation() {
Snackbar.show(vCoordinator, R.string.location_permission_rationale);
Snackbar.show(mBinding.coordinator, R.string.location_permission_rationale);
}


/**
* Restores state after rotation.
*/
private void showCurrentLocation() {
vEmpty.setVisibility(View.GONE);
vCards.setVisibility(View.VISIBLE);
vFab.setVisibility(View.VISIBLE);
vCurrentLocation.updateLocation(mGps.getLastLocation());
mBinding.currentLocation.updateLocation(mGps.getLastLocation());
boolean hasMeasurements = mMeasurements.size() > 0;
if (!hasMeasurements || mAverager.isRunning()) {
vCurrentLocation.setVisibility(View.VISIBLE);
mBinding.currentLocation.setVisibility(View.VISIBLE);
} else {
vCurrentLocation.setVisibility(View.GONE);
mBinding.currentLocation.setVisibility(View.GONE);
}
vAverageLocation.updateLocation(mMeasurements.getAveragedLocation());
mBinding.averageLocation.updateLocation(mMeasurements.getAveragedLocation());
if (mAverager.isRunning()) {
vAverageLocation.setVisibility(View.VISIBLE);
vAverageLocation.getActionsView().setVisibility(View.GONE);
mBinding.averageLocation.setVisibility(View.VISIBLE);
mBinding.averageLocation.getActionsView().setVisibility(View.GONE);
} else {
if (hasMeasurements) {
vAverageLocation.setVisibility(View.VISIBLE);
vAverageLocation.getActionsView().setVisibility(View.VISIBLE);
mBinding.averageLocation.setVisibility(View.VISIBLE);
mBinding.averageLocation.getActionsView().setVisibility(View.VISIBLE);
} else {
vAverageLocation.setVisibility(View.GONE);
mBinding.averageLocation.setVisibility(View.GONE);
}
}
}

private void showWaitingForGps() {
showEmpty();
vProgress.setVisibility(View.VISIBLE);
vStatus.setText(R.string.waiting_for_gps);
vSatellites.setVisibility(View.VISIBLE);
}

private void startAveraging() {
if (vCurrentLocation.getVisibility() == View.GONE) {
mAnimations.collapseAndMoveDown(vAverageLocation, vCurrentLocation);
mViewModel.isAveraging.set(true);
if (mBinding.currentLocation.getVisibility() == View.GONE) {
mAnimations.collapseAndMoveDown(mBinding.averageLocation, mBinding.currentLocation);
} else {
vAverageLocation.setVisibility(View.VISIBLE); // animation doesn't work otherwise
mAnimations.showFromTop(vAverageLocation);
mBinding.averageLocation.setVisibility(View.VISIBLE); // animation doesn't work otherwise
mAnimations.showFromTop(mBinding.averageLocation);
}
mAverager.start();
}

private void changeFab() {
if (mAverager.isRunning()) {
vFab.setImageResource(R.drawable.ic_stop);
} else {
vFab.setImageResource(R.drawable.ic_record);
}
}

private void stopAveraging() {
mAnimations.hideToTop(vCurrentLocation);
mAnimations.moveUpAndExpand(vAverageLocation);
mViewModel.isAveraging.set(false);
mAnimations.hideToTop(mBinding.currentLocation);
mAnimations.moveUpAndExpand(mBinding.averageLocation);
mAverager.stop();
mIntents.answerToThirdParty(getActivity());
}

private void showEmpty() {
vEmpty.setVisibility(View.VISIBLE);
vCards.setVisibility(View.GONE);
vFab.setVisibility(View.GONE);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package org.destil.gpsaveraging.ui.viewmodel;

import android.databinding.ObservableBoolean;
import android.databinding.ObservableField;
import android.location.Location;

/**
* ViewModel for Main Fragment data binding.
*
* @author David Vávra ([email protected])
*/

public class MainFragmentViewModel {
public final ObservableBoolean hasFix = new ObservableBoolean();
public final ObservableField<String> satelliteInfo = new ObservableField<>();
public final ObservableBoolean isAveraging = new ObservableBoolean();
public final ObservableBoolean isReadyForSharing = new ObservableBoolean();
}
Loading

0 comments on commit ba1157c

Please sign in to comment.