Skip to content

Commit 3e8bb31

Browse files
Merge pull request #42 from CodeForEindhoven/1.4-Alpha
1.4 alpha to master
2 parents 6b6f1d4 + b01c4b0 commit 3e8bb31

47 files changed

Lines changed: 961 additions & 648 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

app/build.gradle

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ apply plugin: 'com.android.application'
33
android {
44

55
compileSdkVersion 24
6-
buildToolsVersion "24"
6+
buildToolsVersion "24.0.2"
77
defaultConfig {
88
applicationId "org.open311.android"
99
minSdkVersion 16
1010
targetSdkVersion 24
11-
versionCode 4
12-
versionName "1.3-alpha"
11+
versionCode 5
12+
versionName "1.4-alpha"
1313
multiDexEnabled true
1414
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
1515
}
Lines changed: 73 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,62 @@
11
package org.open311.android;
22

3-
import android.app.ProgressDialog;
3+
import android.content.DialogInterface;
44
import android.content.Intent;
55
import android.content.SharedPreferences;
6-
import android.os.AsyncTask;
76
import android.os.Bundle;
7+
import android.support.design.widget.Snackbar;
88
import android.support.design.widget.TabLayout;
99
import android.support.v4.app.FragmentManager;
1010
import android.support.v4.view.ViewPager;
11+
import android.support.v7.app.AlertDialog;
1112
import android.support.v7.app.AppCompatActivity;
1213
import android.support.v7.widget.Toolbar;
1314
import android.util.Log;
1415
import android.view.Menu;
1516
import android.view.MenuItem;
16-
import android.view.View;
1717

18-
import org.codeforamerica.open311.facade.APIWrapper;
19-
import org.codeforamerica.open311.facade.APIWrapperFactory;
20-
import org.codeforamerica.open311.facade.EndpointType;
18+
import org.codeforamerica.open311.facade.Servers;
2119
import org.codeforamerica.open311.facade.data.City;
20+
import org.codeforamerica.open311.facade.data.Server;
2221
import org.codeforamerica.open311.facade.data.Service;
2322
import org.codeforamerica.open311.facade.data.ServiceRequest;
24-
import org.codeforamerica.open311.facade.exceptions.APIWrapperException;
23+
import org.open311.android.adapters.CitiesAdapter;
2524
import org.open311.android.adapters.ViewPagerAdapter;
2625

27-
import org.open311.android.fragments.CityFragment;
2826
import org.open311.android.fragments.PolicyFragment;
2927
import org.open311.android.fragments.ProfileFragment;
3028
import org.open311.android.fragments.ReportFragment;
3129
import org.open311.android.fragments.RequestsFragment;
3230
import org.open311.android.helpers.Installation;
3331

34-
import java.io.IOException;
3532
import java.util.List;
3633

34+
import static org.open311.android.fragments.ReportFragment.LOCATION_REQUEST;
3735
import static org.open311.android.helpers.Utils.*;
3836

3937
import io.tus.android.client.TusPreferencesURLStore;
4038

4139
public class MainActivity extends AppCompatActivity
4240
implements
4341
RequestsFragment.OnListFragmentInteractionListener,
44-
CityFragment.OnListFragmentInteractionListener,
4542
FragmentManager.OnBackStackChangedListener {
4643
private String installationId;
4744

4845
private List<Service> services;
4946

5047
private City currentCity;
51-
private ReportFragment reportFragment;
52-
private CityFragment cityFragment;
5348
private static final String LOG_TAG = "MainActivity";
5449

5550
protected SharedPreferences settings;
5651

57-
58-
public List<Service> getServices() {
59-
return services;
60-
}
61-
6252
public City getCurrentCity() {
53+
settings = getSettings(this);
54+
String cur_city = settings.getString("current_city", null);
55+
if (cur_city != null) {
56+
setCurrentCity(City.fromString(cur_city));
57+
} else {
58+
setCurrentCity(City.fromString(getString(R.string.open311_endpoint)));
59+
}
6360
return currentCity;
6461
}
6562

@@ -77,8 +74,6 @@ protected void onCreate(Bundle savedInstanceState) {
7774
Log.d(LOG_TAG, "onCreate");
7875
super.onCreate(savedInstanceState);
7976

80-
settings = getSettings(this);
81-
setCurrentCity(City.fromString(getString(R.string.open311_endpoint)));
8277
installationId = Installation.id(this);
8378
setContentView(R.layout.activity_main);
8479

@@ -92,32 +87,71 @@ protected void onCreate(Bundle savedInstanceState) {
9287

9388
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
9489
tabLayout.setupWithViewPager(viewPager);
95-
96-
if (savedInstanceState != null) {
97-
Log.d(LOG_TAG, "Restoring reportFragment");
98-
// Restore the fragment's instance
99-
reportFragment = (ReportFragment) getSupportFragmentManager().getFragment(
100-
savedInstanceState, "reportFragment");
101-
}
102-
new DownloadPictures().execute();
10390
}
10491

10592
@Override
10693
public boolean onCreateOptionsMenu(Menu menu) {
94+
final List<Server> servers = new Servers().getCollection();
10795
getMenuInflater().inflate(R.menu.main, menu);
108-
109-
MenuItem actionItem = menu.findItem(R.id.setting_general);
110-
actionItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
96+
MenuItem mapItem = menu.findItem(R.id.setting_map);
97+
MenuItem cityItem = menu.findItem(R.id.setting_general);
98+
cityItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
11199
@Override
112100
public boolean onMenuItemClick(MenuItem item) {
113-
cityFragment = new CityFragment();
114-
getSupportFragmentManager().beginTransaction()
115-
.add(R.id.cities_fragment, cityFragment)
116-
.commit();
117-
View citiesView = findViewById(R.id.cities_fragment);
118-
assert citiesView != null;
119-
citiesView.bringToFront();
120-
return true;
101+
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
102+
if (servers == null) {
103+
String msg = getString(R.string.citiesListUnavailable);
104+
Snackbar.make(findViewById(R.id.appbar), msg, Snackbar.LENGTH_SHORT)
105+
.show();
106+
return false;
107+
}
108+
final String[] values = new String[servers.size()];
109+
int index = 0;
110+
for (Server srv : servers) {
111+
values[index] = srv.getName();
112+
index++;
113+
}
114+
builder.setAdapter(new CitiesAdapter(MainActivity.this, servers),
115+
new DialogInterface.OnClickListener() {
116+
@Override
117+
public void onClick(DialogInterface dialog, int index) {
118+
String result = null;
119+
if (!currentCity.getCityName().equals(values[index])) {
120+
Log.d(LOG_TAG, "onCreateOptionsMenu - Selected City: " + values[index]);
121+
result = saveSetting(MainActivity.this, "current_city", values[index]);
122+
123+
//remove sharedSettings for Map so map resets
124+
removeSetting(MainActivity.this, "map_address_string");
125+
removeSetting(MainActivity.this, "map_latitude");
126+
removeSetting(MainActivity.this, "map.longitude");
127+
removeSetting(MainActivity.this, "map_zoom");
128+
129+
getCurrentCity();
130+
recreate();
131+
}
132+
if (result != null) {
133+
Snackbar.make(findViewById(R.id.appbar), result, Snackbar.LENGTH_SHORT)
134+
.show();
135+
}
136+
}
137+
});
138+
builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
139+
public void onClick(DialogInterface dialog, int id) {
140+
// User cancelled the dialog
141+
dialog.dismiss();
142+
}
143+
});
144+
builder.show();
145+
return false;
146+
}
147+
});
148+
mapItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
149+
@Override
150+
public boolean onMenuItemClick(MenuItem menuItem) {
151+
//Show the map
152+
Intent intent = new Intent(MainActivity.this, MapActivity.class);
153+
startActivityForResult(intent, LOCATION_REQUEST);
154+
return false;
121155
}
122156
});
123157
return true;
@@ -156,13 +190,6 @@ public void onBackStackChanged() {
156190
public void onSaveInstanceState(Bundle savedInstanceState) {
157191
Log.d(LOG_TAG, "onSaveInstance");
158192
super.onSaveInstanceState(savedInstanceState);
159-
if (reportFragment != null) {
160-
// Save the fragment's instance
161-
Log.d(LOG_TAG, "Saving reportFragment");
162-
getSupportFragmentManager().putFragment(
163-
savedInstanceState, "reportFragment", reportFragment);
164-
}
165-
166193
}
167194

168195
@Override
@@ -176,7 +203,6 @@ public boolean onSupportNavigateUp() {
176203
@Override
177204
protected void onStop() {
178205
super.onStop();
179-
saveSettings(this);
180206
}
181207

182208
private void setupViewPager(ViewPager viewPager) {
@@ -186,7 +212,7 @@ private void setupViewPager(ViewPager viewPager) {
186212
adapter.addFragment(new ProfileFragment());
187213
adapter.addFragment(new PolicyFragment());
188214
viewPager.setAdapter(adapter);
189-
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener(){
215+
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
190216
@Override
191217
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
192218

@@ -209,73 +235,4 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) {
209235
Log.d(LOG_TAG, "onActivityResult");
210236
super.onActivityResult(requestCode, resultCode, data);
211237
}
212-
213-
@Override
214-
public void onListFragmentInteraction(City item) {
215-
216-
}
217-
218-
private class DownloadPictures extends AsyncTask<String, Void, String> {
219-
220-
ProgressDialog progressDialog;
221-
222-
@Override
223-
protected String doInBackground(String... params) {
224-
225-
APIWrapper wrapper;
226-
try {
227-
wrapper = new APIWrapperFactory(getCurrentCity(), EndpointType.PRODUCTION).build();
228-
publishProgress();
229-
services = wrapper.getServiceList();
230-
publishProgress();
231-
Thread.sleep(2000);
232-
233-
} catch (APIWrapperException e) {
234-
e.printStackTrace();
235-
} catch (ClassNotFoundException e) {
236-
e.printStackTrace();
237-
} catch (IOException e) {
238-
e.printStackTrace();
239-
} catch (InterruptedException e) {
240-
e.printStackTrace();
241-
}
242-
243-
return null;
244-
245-
}
246-
247-
@Override
248-
protected void onPostExecute(String result) {
249-
250-
progressDialog.cancel();
251-
252-
//Call your method that checks if the pictures were downloaded
253-
254-
}
255-
256-
@Override
257-
protected void onPreExecute() {
258-
259-
progressDialog = new ProgressDialog(
260-
MainActivity.this);
261-
262-
progressDialog.setMessage(getString(R.string.contactingServer) + " " + getCurrentCity().getCityName());
263-
MainActivity.this.setTitle(getString(R.string.app_name) + " " + getCurrentCity().getTitle());
264-
progressDialog.setCancelable(false);
265-
progressDialog.show();
266-
267-
}
268-
269-
@Override
270-
protected void onProgressUpdate(Void... values) {
271-
if (services == null) {
272-
progressDialog.setMessage(getString(R.string.connectionEstablished));
273-
} else {
274-
if (services.size() > 0) {
275-
progressDialog.setMessage(services.size() + " " + getString(R.string.servicesDownloaded));
276-
}
277-
}
278-
}
279-
280-
}
281238
}

app/src/main/java/org/open311/android/MapActivity.java

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import android.content.Context;
55
import android.content.DialogInterface;
66
import android.content.Intent;
7+
import android.content.SharedPreferences;
78
import android.content.pm.PackageManager;
89
import android.location.Address;
910
import android.location.Location;
@@ -48,7 +49,11 @@
4849
import java.util.List;
4950
import java.util.Locale;
5051

52+
import static org.open311.android.helpers.Utils.getSettings;
53+
import static org.open311.android.helpers.Utils.saveSetting;
54+
5155
public class MapActivity extends AppCompatActivity {
56+
private SharedPreferences settings;
5257
private MapView mapView;
5358
private MapboxMap map;
5459

@@ -83,7 +88,7 @@ private enum source {
8388
protected void onCreate(Bundle savedInstanceState) {
8489

8590
super.onCreate(savedInstanceState);
86-
91+
settings = getSettings(this);
8792
// Mapbox access token only needs to be configured once in your app
8893
MapboxAccountManager.start(this, getString(R.string.mapbox_api_key));
8994
setContentView(R.layout.activity_map);
@@ -99,12 +104,24 @@ protected void onCreate(Bundle savedInstanceState) {
99104
mapView.getMapAsync(new OnMapReadyCallback() {
100105
@Override
101106
public void onMapReady(MapboxMap mapboxMap) {
102-
City city = City.fromString(getString(R.string.open311_endpoint));
107+
City city = City.fromString(settings.getString("current_city", getString(R.string.open311_endpoint)));
103108
if (city.getMap() != null) {
104-
LatLng point = new LatLng(city.getMap().getLat(), city.getMap().getLon());
109+
LatLng point = new LatLng(
110+
settings.getFloat("map_latitude", city.getMap().getLat()),
111+
settings.getFloat("map_longitude", city.getMap().getLon())
112+
);
113+
mapboxMap.setCameraPosition(new CameraPosition.Builder()
114+
.target(point)
115+
.zoom((double) settings.getFloat("map_zoom", city.getMap().getZoom()))
116+
.build());
117+
} else {
118+
LatLng point = new LatLng(
119+
settings.getFloat("map_latitude", 0.0f),
120+
settings.getFloat("map_longitude", 0.0f)
121+
);
105122
mapboxMap.setCameraPosition(new CameraPosition.Builder()
106123
.target(point)
107-
.zoom(new Double(city.getMap().getZoom()))
124+
.zoom((double) settings.getFloat("map_zoom", 0.0f))
108125
.build());
109126
}
110127
map = mapboxMap;
@@ -115,6 +132,7 @@ public void onMapClick(@NonNull LatLng point) {
115132
sourceType = source.CLICK.value;
116133
latitude = (float) point.getLatitude();
117134
longitude = (float) point.getLongitude();
135+
118136
//updateMap, but don't center it
119137
updateMap(false);
120138
}
@@ -137,10 +155,14 @@ public void onClick(View v) {
137155
@Override
138156
public void onClick(View v) {
139157
Intent data = new Intent();
158+
140159
data.putExtra("address_string", Utils.formatAddress(address));
141160
data.putExtra("latitude", latitude);
142161
data.putExtra("longitude", longitude);
143162
data.putExtra("source", sourceType);
163+
saveSetting(MapActivity.this, "map_latitude", latitude);
164+
saveSetting(MapActivity.this, "map_longitude", longitude);
165+
saveSetting(MapActivity.this, "map_zoom", (float) map.getCameraPosition().zoom);
144166
setResult(RESULT_OK, data);
145167
finish();
146168
}

app/src/main/java/org/open311/android/SoundRecorderActivity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ private void stopRecording() {
213213

214214
Log.i(LOG_TAG, "Recording stopped");
215215
mCurrentRecordingState = RecordingState.STOPPED;
216-
mRecordAudioControlButton.setImageDrawable(ContextCompat.getDrawable(SoundRecorderActivity.this.getApplication().getBaseContext(), R.drawable.ic_mic_white_24dp));
216+
mRecordAudioControlButton.setImageDrawable(ContextCompat.getDrawable(SoundRecorderActivity.this.getApplication().getBaseContext(), R.drawable.ic_mic_white));
217217
mRecordSubmitButton.setVisibility(View.VISIBLE);
218218
}
219219

0 commit comments

Comments
 (0)