diff --git a/.classpath b/.classpath
index 4020da010..513d7ee68 100644
--- a/.classpath
+++ b/.classpath
@@ -1,15 +1,18 @@
-
-
+
+
+
+
+
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 90adfa79e..1f0f39282 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -327,6 +327,14 @@
+
+
+
+
+
+
+
+
diff --git a/libs/jcip-annotations-1.0.jar b/libs/jcip-annotations-1.0.jar
new file mode 100644
index 000000000..06e9066b8
Binary files /dev/null and b/libs/jcip-annotations-1.0.jar differ
diff --git a/libs/json-smart-1.1.1.jar b/libs/json-smart-1.1.1.jar
new file mode 100644
index 000000000..0c640aa10
Binary files /dev/null and b/libs/json-smart-1.1.1.jar differ
diff --git a/libs/nimbus-jose-jwt-2.25.jar b/libs/nimbus-jose-jwt-2.25.jar
new file mode 100644
index 000000000..2548ff0b9
Binary files /dev/null and b/libs/nimbus-jose-jwt-2.25.jar differ
diff --git a/res/drawable-hdpi/home_openidconnect.png b/res/drawable-hdpi/home_openidconnect.png
new file mode 100644
index 000000000..d6ecc5558
Binary files /dev/null and b/res/drawable-hdpi/home_openidconnect.png differ
diff --git a/res/drawable-mdpi/home_openidconnect.png b/res/drawable-mdpi/home_openidconnect.png
new file mode 100644
index 000000000..be385eb53
Binary files /dev/null and b/res/drawable-mdpi/home_openidconnect.png differ
diff --git a/res/layout/openidconnect_home.xml b/res/layout/openidconnect_home.xml
new file mode 100644
index 000000000..e4c665a7a
--- /dev/null
+++ b/res/layout/openidconnect_home.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/edu/mit/mitmobile2/HomeScreenActivity.java b/src/edu/mit/mitmobile2/HomeScreenActivity.java
index 426b0e9be..ff86d396f 100644
--- a/src/edu/mit/mitmobile2/HomeScreenActivity.java
+++ b/src/edu/mit/mitmobile2/HomeScreenActivity.java
@@ -36,6 +36,7 @@
import edu.mit.mitmobile2.emergency.EmergencyModule;
import edu.mit.mitmobile2.events.EventsModule;
import edu.mit.mitmobile2.facilities.FacilitiesModule;
+import edu.mit.mitmobile2.id.OpenIDConnectModule;
import edu.mit.mitmobile2.libraries.LibrariesModule;
import edu.mit.mitmobile2.links.LinksModule;
import edu.mit.mitmobile2.maps.MapsModule;
@@ -124,6 +125,7 @@ void createView() {
new DiningModule(),
new QRReaderModule(),
new LinksModule(),
+ new OpenIDConnectModule()
};
mSpringBoard = (GridView) findViewById(R.id.homeSpringBoardGV);
diff --git a/src/edu/mit/mitmobile2/id/OpenIDConnectActivity.java b/src/edu/mit/mitmobile2/id/OpenIDConnectActivity.java
new file mode 100644
index 000000000..bc44e34d7
--- /dev/null
+++ b/src/edu/mit/mitmobile2/id/OpenIDConnectActivity.java
@@ -0,0 +1,580 @@
+package edu.mit.mitmobile2.id;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+
+import net.minidev.json.JSONObject;
+import net.minidev.json.parser.JSONParser;
+import net.minidev.json.parser.ParseException;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+import org.apache.http.NameValuePair;
+import org.apache.http.StatusLine;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.message.BasicNameValuePair;
+
+import com.nimbusds.jose.util.JSONObjectUtils;
+import com.nimbusds.jwt.JWT;
+import com.nimbusds.jwt.JWTParser;
+
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
+import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
+import android.net.Uri;
+import android.os.Bundle;
+import android.preference.PreferenceManager;
+import android.util.Log;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.TextView;
+import android.widget.ToggleButton;
+import edu.mit.mitmobile2.NewModule;
+import edu.mit.mitmobile2.NewModuleActivity;
+import edu.mit.mitmobile2.R;
+
+public class OpenIDConnectActivity extends NewModuleActivity implements
+ OnSharedPreferenceChangeListener {
+
+
+ public static final String TAG = OpenIDConnectActivity.class.getSimpleName();
+
+ // TODO: these are all specific to the MIT server
+ private String issuer = "https://oidc.mit.edu/";
+ private String authorizationEndpoint = issuer + "authorize";
+ private String tokenEndpoint = issuer + "token";
+ private String userInfoEndpoint = issuer + "userinfo";
+ private String revocationEndpoint = issuer + "revoke";
+
+
+ private String clientId = "05a3f7f5-c6db-4b1b-aca6-cc2f3c163b78";
+
+ @Override
+ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
+ }
+
+ @Override
+ protected NewModule getNewModule() {
+ return new OpenIDConnectModule();
+ }
+
+ @Override
+ protected boolean isScrollable() {
+ return true;
+ }
+
+ @Override
+ protected void onOptionSelected(String optionId) {
+ }
+
+ @Override
+ protected boolean isModuleHomeActivity() {
+ return true;
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ Log.d(TAG, "onCreate()");
+ super.onCreate(savedInstanceState);
+
+ setContentView(R.layout.openidconnect_home);
+
+ Button loginButton = (Button)findViewById(R.id.openid_login);
+
+ loginButton.setOnClickListener(new OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+
+ // create a randomized State string and save it
+ String state = UUID.randomUUID().toString();
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(OpenIDConnectActivity.this);
+ Editor edit = prefs.edit();
+ edit.putString("oidc_state", state);
+ edit.commit();
+
+
+ // TODO: use a real URL builder
+ String url = authorizationEndpoint;
+
+ url = url + "?client_id=" + clientId;
+ url = url + "&response_type=code";
+ url = url + "&state=" + state;
+ url = url + "&scope=openid+email+profile+address+phone+offline_access+techcash+libraries";
+
+ Log.d(TAG, "Loading authorization URL: " + url);
+
+ Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
+ startActivity(intent);
+ }
+ });
+
+ Button logoutButton = (Button)findViewById(R.id.openid_logout);
+
+ logoutButton.setOnClickListener(new OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+
+ revokeTokens();
+
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(OpenIDConnectActivity.this);
+ Editor edit = prefs.edit();
+ edit.putString("oidc_accesstoken", "");
+ edit.putString("oidc_refreshtoken", "");
+ edit.putString("oidc_idtoken", "");
+ edit.putString("oidc_subject", "");
+ edit.putString("oidc_username", "");
+ edit.putString("oidc_email", "");
+ edit.commit();
+ updateDisplay();
+ }
+ });
+
+ Button profileButton = (Button)findViewById(R.id.openid_profile);
+
+ profileButton.setOnClickListener(new OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+ loadProfile();
+ updateDisplay();
+ }
+ });
+
+ }
+
+ private void revokeTokens() {
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(OpenIDConnectActivity.this);
+ String idToken = getIdToken(prefs);
+ String accessToken = getAccesstoken(prefs);
+ String refreshToken = getRefreshToken(prefs);
+
+ revokeSingleToken(idToken);
+ revokeSingleToken(accessToken);
+ revokeSingleToken(refreshToken);
+
+ }
+
+ private void revokeSingleToken(String tokenValue) {
+
+ try {
+
+ HttpClient client = new DefaultHttpClient();
+ String url = revocationEndpoint;
+
+ HttpPost post = new HttpPost(url);
+
+ List params = new ArrayList();
+ params.add(new BasicNameValuePair("client_id", clientId));
+ params.add(new BasicNameValuePair("token", tokenValue));
+ post.setEntity(new UrlEncodedFormEntity(params));
+
+ HttpResponse response = client.execute(post);
+
+ StatusLine result = response.getStatusLine();
+
+ Log.d(TAG, "Revoked token, result was: " + result.getStatusCode());
+
+ } catch (ClientProtocolException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IllegalStateException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ private String getRefreshToken(SharedPreferences prefs) {
+ return prefs.getString("oidc_refreshtoken", "");
+ }
+
+ private String getAccesstoken(SharedPreferences prefs) {
+ return prefs.getString("oidc_accesstoken", "");
+ }
+
+ private String getIdToken(SharedPreferences prefs) {
+ return prefs.getString("oidc_idtoken", "");
+ }
+
+ private void updateDisplay() {
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
+
+ String idToken = getIdToken(prefs);
+ String accessToken = getAccesstoken(prefs);
+ String refreshToken = getRefreshToken(prefs);
+
+ idToken = checkExpiredToken(idToken);
+ accessToken = checkExpiredToken(accessToken);
+ refreshToken = checkExpiredToken(refreshToken);
+ // save the checked values
+ Editor edit = prefs.edit();
+ edit.putString("oidc_accesstoken", accessToken);
+ edit.putString("oidc_idtoken", idToken);
+ edit.putString("oidc_refreshtoken", refreshToken);
+ edit.commit();
+
+
+ String subjectVal = prefs.getString("oidc_subject", "");
+ String usernameVal = prefs.getString("oidc_username", "");
+ String emailVal = prefs.getString("oidc_email", "");
+
+ TextView subjectView = (TextView)findViewById(R.id.subjectVal);
+ TextView usernameView = (TextView)findViewById(R.id.usernameVal);
+ TextView emailView = (TextView)findViewById(R.id.emailVal);
+
+ subjectView.setText(subjectVal);
+ usernameView.setText(usernameVal);
+ emailView.setText(emailVal);
+
+ ToggleButton idToggle = (ToggleButton)findViewById(R.id.openid_idtoken);
+ ToggleButton accessToggle = (ToggleButton)findViewById(R.id.openid_access);
+ ToggleButton refreshToggle = (ToggleButton)findViewById(R.id.openid_refresh);
+
+ if (idToken != null && !idToken.isEmpty()) {
+ idToggle.setChecked(true);
+ } else {
+ idToggle.setChecked(false);
+ }
+
+ if (accessToken != null && !accessToken.isEmpty()) {
+ accessToggle.setChecked(true);
+ } else {
+ accessToggle.setChecked(false);
+ }
+
+ if (refreshToken != null && !refreshToken.isEmpty()) {
+ refreshToggle.setChecked(true);
+ } else {
+ refreshToggle.setChecked(false);
+ }
+
+ }
+
+ private String checkExpiredToken(String token) {
+ if (token == null || token.equals("")) {
+ return "";
+ }
+
+ try {
+ JWT jwt = JWTParser.parse(token);
+
+ if (jwt.getJWTClaimsSet().getExpirationTime() != null) {
+ Date now = new Date();
+ if (jwt.getJWTClaimsSet().getExpirationTime().before(now)) {
+ // token is expired!
+ return "";
+ } else {
+ return token;
+ }
+ } else {
+ return token;
+ }
+
+ } catch (java.text.ParseException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ return "";
+ }
+
+ @Override
+ protected void onStart() {
+ Log.d(TAG, "onStart()");
+
+ super.onStart();
+
+ Intent intent = getIntent();
+ Log.d(TAG, "Intent: " + intent.getDataString());
+ Log.d(TAG, "Scheme: " + intent.getScheme());
+ //Log.d(TAG, "Data.Scheme: " + intent.getData().getScheme());
+ //Log.d(TAG, "Query: " + intent.getData().getQuery());
+
+ if (intent.getScheme() != null && intent.getScheme().equals("mitmobile2")) {
+ // processing a callback URL of some type
+ authorizationCallback(intent);
+ }
+
+ updateDisplay();
+ }
+
+ private void authorizationCallback(Intent intent) {
+ String code = intent.getData().getQueryParameter("code");
+ String state = intent.getData().getQueryParameter("state");
+
+ Log.d(TAG, "Code: " + code);
+ Log.d(TAG, "State: " + state);
+
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(OpenIDConnectActivity.this);
+ String savedState = prefs.getString("oidc_state", "");
+
+ // TODO: check "state" for consistency
+ if (state.equals(savedState)) {
+ Log.d(TAG, "States match!");
+ } else {
+ Log.d(TAG, "States don't match :(");
+ }
+
+
+ // Fetch a token
+ HttpClient client = new DefaultHttpClient();
+ String url = tokenEndpoint;
+
+ try {
+
+ HttpPost post = new HttpPost(url);
+
+ List params = new ArrayList();
+ params.add(new BasicNameValuePair("client_id", clientId));
+ //params.add(new BasicNameValuePair("client_secret", clientSecret));
+ params.add(new BasicNameValuePair("grant_type", "authorization_code"));
+ params.add(new BasicNameValuePair("code", code));
+ post.setEntity(new UrlEncodedFormEntity(params));
+
+ post.setHeader("Accept", "application/json");
+
+ HttpResponse response = client.execute(post);
+
+ StatusLine result = response.getStatusLine();
+
+ if (result.getStatusCode() == HttpStatus.SC_OK) {
+ // get the body, parse as JSON
+ HttpEntity entity = response.getEntity();
+
+ JSONParser parser = new JSONParser(JSONParser.DEFAULT_PERMISSIVE_MODE);
+ JSONObject obj = (JSONObject) parser.parse(entity.getContent());
+
+ String idTokenTxt = JSONObjectUtils.getString(obj, "id_token");
+ String accessToken = JSONObjectUtils.getString(obj, "access_token");
+ String refreshToken = JSONObjectUtils.getString(obj, "refresh_token");
+
+ Log.d(TAG, "Got ID Token: " + idTokenTxt);
+ Log.d(TAG, "Got Access Token: " + accessToken);
+ Log.d(TAG, "Got Refresh Token: " + refreshToken);
+
+ // parse the ID Token
+ JWT jwt = JWTParser.parse(idTokenTxt);
+ String subject = jwt.getJWTClaimsSet().getStringClaim("sub");
+
+ Log.d(TAG, "Loaded subject: " + subject);
+
+ Editor edit = prefs.edit();
+ edit.putString("oidc_accesstoken", accessToken);
+ edit.putString("oidc_idtoken", idTokenTxt);
+ edit.putString("oidc_refreshtoken", refreshToken);
+ edit.putString("oidc_subject", subject);
+ edit.commit();
+
+
+ }
+
+ } catch (ClientProtocolException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IllegalStateException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (ParseException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (java.text.ParseException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ private void loadProfile() {
+ // Fetch a token
+ HttpClient client = new DefaultHttpClient();
+ String url = userInfoEndpoint;
+
+ try {
+
+
+
+
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(OpenIDConnectActivity.this);
+
+ String accessToken = getAccesstoken(prefs);
+ accessToken = checkExpiredToken(accessToken);
+
+ if (accessToken == null || accessToken.isEmpty()) {
+ // if we don't have an access token, try to refresh it
+ refreshAccessToken();
+ accessToken = getAccesstoken(prefs);
+
+ if (accessToken == null || accessToken.isEmpty()) {
+ // if we still don't have one, bail
+ Log.d(TAG, "Couldn't load profile: no access token");
+ updateDisplay();
+ return;
+ }
+ }
+
+ //url = url + "?access_token=" + accessToken;
+
+ //Log.d(TAG, "Fetching profile: " + url);
+
+ HttpGet get = new HttpGet(url);
+
+ get.setHeader("Authorization", "Bearer " + accessToken);
+ get.setHeader("Accept", "application/json");
+
+ HttpResponse response = client.execute(get);
+
+ StatusLine result = response.getStatusLine();
+
+ if (result.getStatusCode() == HttpStatus.SC_OK) {
+ // get the body, parse as JSON
+ HttpEntity entity = response.getEntity();
+
+ JSONParser parser = new JSONParser(JSONParser.DEFAULT_PERMISSIVE_MODE);
+ JSONObject obj = (JSONObject) parser.parse(entity.getContent());
+
+ String username = JSONObjectUtils.getString(obj, "preferred_username");
+ String email = JSONObjectUtils.getString(obj, "email");
+
+ Log.d(TAG, "Username: " + username);
+ Log.d(TAG, "Email: " + email);
+
+ // parse the ID Token
+ Editor edit = prefs.edit();
+ edit.putString("oidc_username", username);
+ edit.putString("oidc_email", email);
+ edit.commit();
+ } else {
+ // something went wrong, chuck the token
+
+ revokeSingleToken(accessToken);
+
+ Editor edit = prefs.edit();
+ edit.putString("oidc_accesstoken", "");
+ edit.commit();
+
+ }
+ } catch (ClientProtocolException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (UnsupportedEncodingException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IllegalStateException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (ParseException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (java.text.ParseException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ updateDisplay();
+ }
+
+ private void refreshAccessToken() {
+ // Fetch a token
+ HttpClient client = new DefaultHttpClient();
+ String url = tokenEndpoint;
+
+ try {
+
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(OpenIDConnectActivity.this);
+
+ String refreshToken = getRefreshToken(prefs);
+
+ HttpPost post = new HttpPost(url);
+
+ List params = new ArrayList();
+ params.add(new BasicNameValuePair("client_id", clientId));
+ //params.add(new BasicNameValuePair("client_secret", clientSecret));
+ params.add(new BasicNameValuePair("grant_type", "refresh_token"));
+ params.add(new BasicNameValuePair("refresh_token", refreshToken));
+ post.setEntity(new UrlEncodedFormEntity(params));
+
+ post.setHeader("Accept", "application/json");
+
+ HttpResponse response = client.execute(post);
+
+ StatusLine result = response.getStatusLine();
+
+ if (result.getStatusCode() == HttpStatus.SC_OK) {
+ // get the body, parse as JSON
+ HttpEntity entity = response.getEntity();
+
+ JSONParser parser = new JSONParser(JSONParser.DEFAULT_PERMISSIVE_MODE);
+ JSONObject obj = (JSONObject) parser.parse(entity.getContent());
+
+ String idTokenTxt = JSONObjectUtils.getString(obj, "id_token");
+ String accessToken = JSONObjectUtils.getString(obj, "access_token");
+ refreshToken = JSONObjectUtils.getString(obj, "refresh_token");
+
+ Log.d(TAG, "Got ID Token: " + idTokenTxt);
+ Log.d(TAG, "Got Access Token: " + accessToken);
+ Log.d(TAG, "Got Refresh Token: " + refreshToken);
+
+ // parse the ID Token
+ JWT jwt = JWTParser.parse(idTokenTxt);
+ String subject = jwt.getJWTClaimsSet().getStringClaim("sub");
+
+ Log.d(TAG, "Loaded subject: " + subject);
+
+ Editor edit = prefs.edit();
+ edit.putString("oidc_accesstoken", accessToken);
+ edit.putString("oidc_idtoken", idTokenTxt);
+ edit.putString("oidc_refreshtoken", refreshToken);
+ edit.putString("oidc_subject", subject);
+ edit.commit();
+
+
+ }
+
+ } catch (ClientProtocolException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (UnsupportedEncodingException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IllegalStateException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (ParseException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (java.text.ParseException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+
+
+
+}
\ No newline at end of file
diff --git a/src/edu/mit/mitmobile2/id/OpenIDConnectModule.java b/src/edu/mit/mitmobile2/id/OpenIDConnectModule.java
new file mode 100644
index 000000000..8ae126798
--- /dev/null
+++ b/src/edu/mit/mitmobile2/id/OpenIDConnectModule.java
@@ -0,0 +1,53 @@
+package edu.mit.mitmobile2.id;
+
+import java.util.List;
+
+import android.app.Activity;
+import edu.mit.mitmobile2.MITMenuItem;
+import edu.mit.mitmobile2.NewModule;
+import edu.mit.mitmobile2.R;
+
+public class OpenIDConnectModule extends NewModule {
+
+ @Override
+ public List getPrimaryOptions() {
+ return null;
+ }
+
+ @Override
+ public List getSecondaryOptions() {
+ return null;
+ }
+
+ @Override
+ public boolean onItemSelected(Activity activity, String id) {
+ return false;
+ }
+
+ @Override
+ public String getLongName() {
+ return "OpenID Connect Test Application";
+ }
+
+ @Override
+ public String getShortName() {
+ return "OpenID Connect";
+ }
+
+ @Override
+ public Class extends Activity> getModuleHomeActivity() {
+ return OpenIDConnectActivity.class;
+ }
+
+ @Override
+ public int getMenuIconResourceId() {
+ return R.drawable.home_openidconnect;
+ }
+
+ @Override
+ public int getHomeIconResourceId() {
+ return R.drawable.home_openidconnect;
+ }
+
+
+}
diff --git a/src/edu/mit/mitmobile2/shuttles/MITRoutesSliderActivity.java b/src/edu/mit/mitmobile2/shuttles/MITRoutesSliderActivity.java
index 53a019299..bbe1f21f6 100644
--- a/src/edu/mit/mitmobile2/shuttles/MITRoutesSliderActivity.java
+++ b/src/edu/mit/mitmobile2/shuttles/MITRoutesSliderActivity.java
@@ -16,10 +16,10 @@
public class MITRoutesSliderActivity extends SliderListNewModuleActivity {
private static final String TAG = "MITRoutesSliderActivity";
-
- private int selectedPos;
- private int startPos;
+ private static RoutesAsyncListView curView;
+ private int position;
+
static final String KEY_POSITION = "key_position";
static final String NOT_RUNNING = "Bus not running. Following schedule.";
static final String GPS_ONLINE = "Real time bus tracking online.";
@@ -39,8 +39,7 @@ public void onCreate(Bundle savedInstanceState) {
}
Bundle bundle = getIntent().getExtras();
if (null != bundle) {
- startPos = bundle.getInt(KEY_POSITION, 0);
- selectedPos = startPos;
+ position = bundle.getInt(KEY_POSITION, 0);
}
createViews();
@@ -48,22 +47,30 @@ public void onCreate(Bundle savedInstanceState) {
/****************************************************/
@Override
protected void onPause() {
- RoutesAsyncListView oldView = (RoutesAsyncListView) getScreen(selectedPos);
- oldView.terminate();
+ for (int x=0; x < ShuttleModel.getSortedRoutes().size(); x++) {
+ curView = (RoutesAsyncListView) getScreen(x);
+ if (curView!=null) curView.terminate();
+ }
+
+ //if (curView!=null) curView.terminate();
super.onPause();
}
@Override
protected void onStop() {
- //there is no need to terminate RoutesAsyncListView as onPause takes care of this
+ for (int x=0; x < ShuttleModel.getSortedRoutes().size(); x++) {
+ curView = (RoutesAsyncListView) getScreen(x);
+ if (curView!=null) curView.terminate();
+ }
+
+ //if (curView!=null) curView.terminate();
super.onStop();
}
@Override
protected void onResume() {
super.onResume();
- RoutesAsyncListView oldView = (RoutesAsyncListView) getScreen(startPos);
- if(oldView!=null) oldView.onSelected();
+ if (curView!=null) curView.onSelected();
}
@@ -77,27 +84,23 @@ void createViews() {
RouteItem r = ShuttleModel.getSortedRoutes().get(x);
- String routeId = r.route_id; //r.title;
+ String routeId = r.title;
cv = new RoutesAsyncListView(this, routeId, r);
addScreen(cv, r.title);
}
- setPosition(startPos);
+ setPosition(position);
}
@Override
public void onPositionChanged(int newPosition, int oldPosition) {
super.onPositionChanged(newPosition, oldPosition);
Log.d("ZZZ","onPositionChanged");
- if (oldPosition == -1)
- return;
-
- if (oldPosition >= 0) {
- RoutesAsyncListView oldView = (RoutesAsyncListView) getScreen(oldPosition);
- oldView.terminate();
+ if(curView != null) {
+ curView.terminate();
}
- selectedPos = newPosition;
+ curView = (RoutesAsyncListView) getScreen(newPosition);
}
@Override
@@ -113,14 +116,16 @@ static void launchShuttleRouteMap(Context context, RouteItem routeItem, List getPrimaryMenuItems() {
// }
-}
+}