Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Release #200

Merged
merged 35 commits into from
Aug 28, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
3d945fb
Merge pull request #195 from cbalster/sync_with_master
cbalster Jul 21, 2017
8f71a80
Add style for image upload confirmation text
cbalster Jun 5, 2017
ec4f1e4
Remove unused resources
cbalster Jun 5, 2017
f3ce5f0
Fix link to otto license
cbalster Jun 5, 2017
d73c6b8
Only call super.onOptionsItemSelected() in main activity when we didn…
cbalster Jun 8, 2017
eb88336
Decouple UserModel from activity and initialize on construction
cbalster Jun 10, 2017
257f632
Bump gradle to 2.3.3
cbalster Jun 18, 2017
2310e57
Add start and stop methods to service and launch it in application
cbalster Jun 18, 2017
d9dc955
PullServerHandler: minor update
cbalster Jun 18, 2017
fead454
Merge pull request #193 from cbalster/misc
cbalster Jul 24, 2017
b95123a
Save and restore all required instance state
cbalster Jul 23, 2017
0666565
Allow device rotation and adapt map position save and restore accordi…
cbalster Jul 23, 2017
816fe36
Merge pull request #196 from cbalster/state_handling_and_allow_orient…
cbalster Aug 6, 2017
9dc31f5
AppModule: clean up line breaks
cbalster Aug 10, 2017
b7c72e6
Map: make current location button a FAB
cbalster Aug 10, 2017
4481e10
Service: minor refactoring
cbalster Aug 10, 2017
56dbde9
Monitor network connectivity and inform user in map and chat
cbalster Aug 10, 2017
af78df1
Monitor GPS hardware status and notify user
cbalster Aug 11, 2017
84c0440
Use google maven repo
cbalster Aug 12, 2017
c122f02
Update build tools, compile sdk and support lib
cbalster Aug 12, 2017
cb73dfa
No more casting with findViewById
cbalster Aug 12, 2017
6fe385e
Switch to vector drawables where possible
cbalster Aug 12, 2017
455d7e0
Merge pull request #197 from cbalster/hardware_state_handling_and_vec…
cbalster Aug 15, 2017
bac7f5e
Misc deprecation and warning fixes
cbalster Aug 13, 2017
8b66c68
Clean up unused strings
cbalster Aug 13, 2017
cc10f58
Clean up colors
cbalster Aug 13, 2017
3f5d11d
Minor build file cleanup
cbalster Aug 13, 2017
6a9a9f0
Update dependencies
cbalster Aug 13, 2017
e5c2187
Map: add waiting for fix FAB state
cbalster Aug 13, 2017
6b6d138
Map: animate FAB while searching
cbalster Aug 15, 2017
4f543ea
Map: make setting initial location smoother
cbalster Aug 15, 2017
9f7fe7d
Merge pull request #198 from cbalster/housekeeping_and_gps_waiting_state
cbalster Aug 19, 2017
f114829
Start Service in Main again
cbalster Aug 19, 2017
63b36f0
Fix LocationUpdateManager not registering on bus after relaunch
cbalster Aug 19, 2017
15ca66c
Merge pull request #199 from cbalster/service_fix
cbalster Aug 19, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ android:
- platform-tools

# The BuildTools version used by your project
- build-tools-25.0.3
- build-tools-26.0.1

# The SDK version used to compile your project
- android-25
- android-26

# Additional components
# - extra-google-google_play_services
Expand Down
10 changes: 5 additions & 5 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ apply plugin: 'com.android.application'
apply plugin: 'de.mobilej.unmock'

android {
compileSdkVersion 25
buildToolsVersion '25.0.3'
compileSdkVersion 26
buildToolsVersion '26.0.1'

defaultConfig {
applicationId "de.stephanlindauer.criticalmaps"
Expand Down Expand Up @@ -45,19 +45,19 @@ android {

dependencies {
compile 'com.squareup:otto:1.3.8'
compile 'org.osmdroid:osmdroid-android:5.6.3'
compile 'org.osmdroid:osmdroid-android:5.6.5'
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.1.0'
compile "com.android.support:support-v4:$support_version"
compile "com.android.support:appcompat-v7:$support_version"
compile "com.android.support:support-annotations:$support_version"
compile "com.android.support:design:$support_version"

compile 'com.squareup.okhttp3:okhttp:3.8.0'
compile 'com.squareup.okhttp3:okhttp:3.8.1'
compile "com.jakewharton:butterknife:$butterknife_version"
annotationProcessor "com.jakewharton:butterknife-compiler:$butterknife_version"

compile 'org.ligi:AXT:0.35'
compile 'org.ligi:AXT:0.37'
compile 'info.metadude.android:typed-preferences:2.1.0'
compile "com.google.dagger:dagger:$dagger_version"

Expand Down
1 change: 0 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
<activity
android:name="de.stephanlindauer.criticalmaps.Main"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:theme="@style/AppTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import android.app.Application;


public class App extends Application {

private static AppComponent appComponent;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ public interface AppComponent {

void inject(PrerequisitesChecker prerequisitesChecker);

App app();

Picasso picasso();

OwnLocationModel ownLocationmodel();
Expand Down
28 changes: 17 additions & 11 deletions app/src/main/java/de/stephanlindauer/criticalmaps/AppModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.squareup.picasso.Picasso;
import dagger.Module;
import dagger.Provides;
import de.stephanlindauer.criticalmaps.handler.NetworkConnectivityChangeHandler;
import de.stephanlindauer.criticalmaps.handler.ServerResponseProcessor;
import de.stephanlindauer.criticalmaps.managers.LocationUpdateManager;
import de.stephanlindauer.criticalmaps.model.ChatModel;
Expand Down Expand Up @@ -36,17 +37,13 @@ public App provideApp() {
@Provides
@Singleton
public OkHttpClient provideOKHttpClient() {
return new OkHttpClient.Builder()
.connectTimeout(15, TimeUnit.SECONDS)
.build();
return new OkHttpClient.Builder().connectTimeout(15, TimeUnit.SECONDS).build();
}

@Provides
@Singleton
public Picasso providePicasso(App app, OkHttpClient client) {
return new Picasso.Builder(app)
.downloader(new OkHttp3Downloader(client))
.build();
return new Picasso.Builder(app).downloader(new OkHttp3Downloader(client)).build();
}

@Provides
Expand All @@ -58,7 +55,7 @@ public ChatModel provideChatModel() {
@Provides
@Singleton
public UserModel provideUserModel() {
return new UserModel();
return new UserModel(app);
}


Expand All @@ -76,7 +73,10 @@ public OwnLocationModel provideOwnLocationModel() {

@Provides
@Singleton
public ServerResponseProcessor serverResponseProcessor(OtherUsersLocationModel otherUsersLocationModel, EventBusProvider eventService, ChatModel chatModel) {
public ServerResponseProcessor serverResponseProcessor(
OtherUsersLocationModel otherUsersLocationModel,
EventBusProvider eventService,
ChatModel chatModel) {
return new ServerResponseProcessor(otherUsersLocationModel, eventService, chatModel);
}

Expand All @@ -94,11 +94,17 @@ public EventBusProvider provideEventBusProvider() {

@Provides
@Singleton
public LocationUpdateManager provideLocationUpdatesService(
public LocationUpdateManager provideLocationUpdateManager(
OwnLocationModel ownLocationModel,
EventBusProvider eventBusProvider) {
return new LocationUpdateManager(
app, ownLocationModel, eventBusProvider);
return new LocationUpdateManager(app, ownLocationModel, eventBusProvider);
}

@Provides
@Singleton
public NetworkConnectivityChangeHandler provideNetworkConnectivityChangeHandler(
EventBusProvider eventBusProvider) {
return new NetworkConnectivityChangeHandler(app, eventBusProvider);
}

@Provides
Expand Down
50 changes: 27 additions & 23 deletions app/src/main/java/de/stephanlindauer/criticalmaps/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@
import android.support.annotation.NonNull;
import android.support.design.widget.NavigationView;
import android.support.v4.app.Fragment;
import android.support.v4.util.SimpleArrayMap;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.SparseArray;
import android.view.Menu;
import android.view.MenuItem;
import android.view.WindowManager;
Expand All @@ -21,16 +21,13 @@
import butterknife.BindView;
import java.io.File;

import javax.inject.Inject;

import butterknife.ButterKnife;
import de.stephanlindauer.criticalmaps.handler.ApplicationCloseHandler;
import de.stephanlindauer.criticalmaps.handler.PrerequisitesChecker;
import de.stephanlindauer.criticalmaps.handler.ProcessCameraResultHandler;
import de.stephanlindauer.criticalmaps.handler.StartCameraHandler;
import de.stephanlindauer.criticalmaps.helper.clientinfo.BuildInfo;
import de.stephanlindauer.criticalmaps.helper.clientinfo.DeviceInformation;
import de.stephanlindauer.criticalmaps.model.UserModel;
import de.stephanlindauer.criticalmaps.provider.FragmentProvider;
import de.stephanlindauer.criticalmaps.service.ServerSyncService;
import de.stephanlindauer.criticalmaps.utils.DrawerClosingDrawerLayoutListener;
Expand All @@ -39,13 +36,12 @@

public class Main extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

@Inject
UserModel userModel;
private final static String KEY_NAVID = "main_navid";
private final static String KEY_SAVEDFRAGMENTSTATES = "main_savedfragmentstate";

//misc
private File newCameraOutputFile;
private int currentNavId;
private final SimpleArrayMap<Integer, Fragment.SavedState> savedFragmentStates = new SimpleArrayMap<>();
private SparseArray<Fragment.SavedState> savedFragmentStates = new SparseArray<>();

@BindView(R.id.drawer_layout)
DrawerLayout drawerLayout;
Expand All @@ -68,7 +64,17 @@ protected void onPostCreate(Bundle savedInstanceState) {
drawerLayout.addDrawerListener(mDrawerToggle);
mDrawerToggle.syncState();
drawerLayout.addDrawerListener(new DrawerClosingDrawerLayoutListener());
navigateTo(R.id.navigation_map);

if (savedInstanceState != null) {
SparseArray<Fragment.SavedState> restoredStates = savedInstanceState.getSparseParcelableArray(KEY_SAVEDFRAGMENTSTATES);
if (restoredStates != null) {
savedFragmentStates = restoredStates;
}

currentNavId = savedInstanceState.getInt(KEY_NAVID);
} else {
navigateTo(R.id.navigation_map);
}
}

@Override
Expand All @@ -83,9 +89,7 @@ public void onCreate(Bundle bundle) {

new PrerequisitesChecker(this).execute();

userModel.initialize(this);

startSyncService();
ServerSyncService.startService();
}

@Override
Expand All @@ -96,7 +100,6 @@ public boolean onCreateOptionsMenu(Menu menu) {

@Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
switch (item.getItemId()) {
case R.id.action_close:
handleCloseRequested();
Expand All @@ -112,8 +115,9 @@ public boolean onOptionsItemSelected(MenuItem item) {
break;
case R.id.rate_the_app:
startRateTheApp();
default:
break;
default:
return super.onOptionsItemSelected(item);
}
return true;
}
Expand Down Expand Up @@ -165,16 +169,18 @@ protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
}

private void startSyncService() {
Intent syncServiceIntent = new Intent(this, ServerSyncService.class);
startService(syncServiceIntent);
}

@Override
public void onAttachedToWindow() {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
}

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(KEY_NAVID, currentNavId);
outState.putSparseParcelableArray(KEY_SAVEDFRAGMENTSTATES, savedFragmentStates);
}

@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
item.setChecked(true);
Expand All @@ -198,10 +204,8 @@ private void navigateTo(@IdRes int navId) {
currentNavId = navId;
final Fragment nextFragment = FragmentProvider.getFragmentForNavId(navId);

// restore saved state of new fragment if it was shown before
if (savedFragmentStates.containsKey(navId)) {
nextFragment.setInitialSavedState(savedFragmentStates.get(navId));
}
// restore saved state of new fragment if it was shown before; otherwise passing null is ok
nextFragment.setInitialSavedState(savedFragmentStates.get(navId));

getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, nextFragment).commit();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,6 @@
public final class Events {
public final static NewLocationEvent NEW_LOCATION_EVENT = new NewLocationEvent();
public final static NewServerResponseEvent NEW_SERVER_RESPONSE_EVENT = new NewServerResponseEvent();
}
public final static NetworkConnectivityChangedEvent NETWORK_CONNECTIVITY_CHANGED_EVENT = new NetworkConnectivityChangedEvent();
public final static GpsStatusChangedEvent GPS_STATUS_CHANGED_EVENT = new GpsStatusChangedEvent();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package de.stephanlindauer.criticalmaps.events;

public class GpsStatusChangedEvent {
public enum Status {
NONEXISTENT, OFF, LOW_ACCURACY, HIGH_ACCURACY
}

public Status status;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package de.stephanlindauer.criticalmaps.events;

public class NetworkConnectivityChangedEvent {
public boolean isConnected;
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
import de.stephanlindauer.criticalmaps.App;
import de.stephanlindauer.criticalmaps.R;
import de.stephanlindauer.criticalmaps.adapter.ChatMessageAdapter;
import de.stephanlindauer.criticalmaps.events.NetworkConnectivityChangedEvent;
import de.stephanlindauer.criticalmaps.events.NewLocationEvent;
import de.stephanlindauer.criticalmaps.events.NewServerResponseEvent;
import de.stephanlindauer.criticalmaps.interfaces.IChatMessage;
Expand Down Expand Up @@ -78,6 +79,7 @@ public class ChatFragment extends Fragment {
//misc
private boolean isScrolling = false;
private boolean isTextInputEnabled = true;
private boolean isDataConnectionAvailable = true;
private Unbinder unbinder;


Expand Down Expand Up @@ -145,10 +147,6 @@ public void afterTextChanged(Editable s) {
setSendButtonEnabledWithAnimation(s.length() != 0);
}
});

if (ownLocationModel.ownLocation == null) {
setTextInputEnabled(false);
}
}

private void setSendButtonEnabledWithAnimation(final boolean enabled) {
Expand Down Expand Up @@ -215,22 +213,37 @@ public void onDestroyView() {
unbinder.unbind();
}

@Subscribe
public void handleNewServerData(NewServerResponseEvent e) {
chatModelToAdapter();
}

@Subscribe
public void handleNewLocation(NewLocationEvent e) {
setTextInputEnabled(true);
setTextInputState(ownLocationModel.ownLocation != null, isDataConnectionAvailable);
}

@Subscribe
public void handleNewServerData(NewServerResponseEvent e) {
chatModelToAdapter();
public void handleNetworkConnectivityChanged(NetworkConnectivityChangedEvent e) {
isDataConnectionAvailable = e.isConnected;
setTextInputState(ownLocationModel.ownLocation != null, isDataConnectionAvailable);
}

private void setTextInputEnabled(final boolean enabled) {
if (!enabled) {
private void setTextInputState(final boolean locationKnown, final boolean dataEnabled) {
if (!locationKnown || !dataEnabled) {
// FIXME fix this hacky mess of state handling
setSendButtonEnabledWithAnimation(false);
editMessageTextField.setEnabled(false);
textInputLayout.setHint(getString(R.string.map_searching_for_location));
if (dataEnabled) {
textInputLayout.setHint(getString(R.string.map_searching_for_location));
} else {
textInputLayout.setHint(getString(R.string.chat_no_data_connection_hint));
}
isTextInputEnabled = false;
} else if (!isTextInputEnabled) {
if (editMessageTextField.getText().length() > 0) {
setSendButtonEnabledWithAnimation(true);
}
editMessageTextField.setEnabled(true);
textInputLayout.setHint(getString(R.string.chat_text));
isTextInputEnabled = true;
Expand Down
Loading