package tof.cv.mpp; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.preference.PreferenceManager; import android.provider.Settings; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.text.format.DateUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.GridView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.Manifest; import com.astuetz.PagerSlidingTabStrip; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.common.api.ResultCallback; import com.google.android.gms.common.images.ImageManager; import com.google.android.gms.games.Games; import com.google.android.gms.games.Player; import com.google.android.gms.games.achievement.Achievement; import com.google.android.gms.games.achievement.Achievements; import com.google.android.gms.games.leaderboard.LeaderboardScore; import com.google.android.gms.games.leaderboard.LeaderboardScoreBuffer; import com.google.android.gms.games.leaderboard.LeaderboardVariant; import com.google.android.gms.games.leaderboard.Leaderboards; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.koushikdutta.async.future.FutureCallback; import com.koushikdutta.ion.Ion; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import de.keyboardsurfer.android.widget.crouton.Configuration; import de.keyboardsurfer.android.widget.crouton.Crouton; import de.keyboardsurfer.android.widget.crouton.Style; import tof.cv.mpp.Utils.BaseGameFragment; import tof.cv.mpp.Utils.MyPagerAdapter; import tof.cv.mpp.Utils.MyStaggeredGridView; import tof.cv.mpp.Utils.Utils; import tof.cv.mpp.adapter.AchievementAdapter; import tof.cv.mpp.adapter.HighScoreAdapter; import tof.cv.mpp.bo.Station; /** * Created by CVE on 30/01/14. */ public class GameFragment extends BaseGameFragment implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, ImageManager.OnImageLoadedListener, View.OnClickListener, LocationListener { private static final Configuration CONFIGURATION_INFINITE = new Configuration.Builder() .setDuration(Configuration.DURATION_INFINITE) .build(); boolean top = false; StationList.StationsList list; Crouton crouton; Location me; long newScore; //GameHelper mHelper; boolean init = false; Handler handler = new Handler(); public final static String LEADER = "CgkI9Y3S0soCEAIQAg"; public final static String CHECKIN = "CgkI9Y3S0soCEAIQBA"; public final static String CHECKDELAY = "CgkI9Y3S0soCEAIQBQ"; public final static String CHECKHUGEDELAY = "CgkI9Y3S0soCEAIQCA"; public final static String VETERAN = "CgkI9Y3S0soCEAIQCg"; MyPagerAdapter mPagerAdapter; String[] titles; StationList.Stationinfo closest; LocationManager locationManager; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_game, null); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); ((AppCompatActivity) getActivity()).getSupportActionBar().setSubtitle(null); ((AppCompatActivity)getActivity()).getSupportActionBar().setTitle(R.string.nav_drawer_game); ViewPager pager = (ViewPager) getView().findViewById(R.id.pager); titles = this.getResources().getStringArray(R.array.titles); mPagerAdapter = new MyPagerAdapter(titles); pager.setAdapter(mPagerAdapter); //mPagerAdapter.notifyDataSetChanged(); PagerSlidingTabStrip tabs = (PagerSlidingTabStrip) getView().findViewById(R.id.tabs); tabs.setViewPager(pager); pager.setOffscreenPageLimit(2); // mHelper = new GameHelper(getActivity(),); // mHelper.setup(this); try { String langue = getActivity().getString(R.string.url_lang); if (PreferenceManager.getDefaultSharedPreferences(getActivity()).getBoolean( "prefnl", false)) langue = "nl"; if (langue.contentEquals("en")) langue = "fr"; InputStream inputStream = getActivity().getAssets().open("stations" + langue + ".json"); Reader r = new InputStreamReader(inputStream); Gson gson = new Gson(); list = gson.fromJson(r, StationList.StationsList.class); } catch (IOException e) { e.printStackTrace(); } try { me = Utils.getLastLoc(this.getActivity()); locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE); } catch (SecurityException e) { ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 0); } setHasOptionsMenu(true); GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(this.getActivity()) .addApi(Games.API) .addScope(Games.SCOPE_GAMES) .build(); if (isSignedIn()) setupOk(); else beginUserInitiatedSignIn(); } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) switch (requestCode) { case 0: { me = Utils.getLastLoc(this.getActivity()); locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE); if (isSignedIn()) setupOk(); else beginUserInitiatedSignIn(); return; } } return; } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { menu.add(Menu.NONE, 0, Menu.NONE, R.string.game_action_map) .setIcon(android.R.drawable.ic_menu_myplaces) .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (closest != null) switch (item.getItemId()) { case (0): String uri = "geo:0,0?q=" + closest.locationY + "," + closest.locationX + " (" + closest.getStation() + ")"; startActivity(new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(uri))); return true; default: return super.onOptionsItemSelected(item); } return super.onOptionsItemSelected(item); } @Override public void onPause() { super.onPause(); Crouton.cancelAllCroutons(); if (locationManager != null) locationManager.removeUpdates(this); } @Override public void onResume() { super.onResume(); try {//Some devices have no GPS if (locationManager != null) locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10 * DateUtils.SECOND_IN_MILLIS, 10, this); } catch (Exception e) { e.printStackTrace(); } if (init && !this.isSignedIn()) this.beginUserInitiatedSignIn(); init = true; String provider = Settings.Secure.getString(getActivity().getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED); if (!provider.contains(LocationManager.GPS_PROVIDER)) { crouton = Crouton.makeText(getActivity(), R.string.game_err_gps, Style.ALERT, R.id.pager).setConfiguration(CONFIGURATION_INFINITE).setOnClickListener(this); crouton.show(); } } @Override public void onStart() { super.onStart(); mHelper.onStart(this.getActivity()); } @Override public void onStop() { super.onStop(); mHelper.onStop(); } @Override public void onActivityResult(int request, int response, Intent data) { super.onActivityResult(request, response, data); setupOk(); } private void setupOk() { SharedPreferences sp; try { sp = PreferenceManager.getDefaultSharedPreferences(getActivity()); } catch (Exception e) { e.printStackTrace(); return; } int score = sp.getInt("searchGame", 0) + 1; boolean chat = sp.getBoolean("chatUnlock", false); Log.e("", "chat " + chat); try { Games.Achievements.setSteps(getApiClient(), PlannerFragment.SEARCH, score); if (chat) Games.Achievements.unlock(getApiClient(), ChatActivity.ID); } catch (Exception e) { e.printStackTrace(); } Log.e("", "SETUP"); try { getView().findViewById(R.id.profile).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { getActivity().startActivityForResult(Games.Leaderboards.getLeaderboardIntent(getApiClient(), LEADER), 1); } catch (Exception e) { e.printStackTrace(); } } }); } catch (Exception e) { e.printStackTrace(); } try {//Just to be sure player exists Games.Leaderboards.submitScore(getApiClient(), LEADER, newScore); } catch (Exception e) { e.printStackTrace(); } try { Player p = Games.Players.getCurrentPlayer(getApiClient()); try { ((TextView) getView().findViewById(R.id.currentuserName)).setText(p.getDisplayName()); } catch (Exception e) { e.printStackTrace(); } //Picasso.with(this.getActivity()).load(p.getIconImageUri().getPath()).into((ImageView)getView().findViewById(R.id.profilePic)); ImageManager im = ImageManager.create(this.getActivity()); im.loadImage(this, p.getHiResImageUri()); id = p.getPlayerId(); refreshScores(); } catch (Exception e) { e.printStackTrace(); } try { int installed = (int) (System.currentTimeMillis() - getActivity() .getPackageManager() .getPackageInfo(getActivity().getPackageName(), 0) .firstInstallTime) / (int) DateUtils.DAY_IN_MILLIS; if (installed > 0) Games.Achievements.setSteps(getApiClient(), VETERAN, installed); Log.e("", "installed" + installed); Games.Achievements.load(getApiClient(), false).setResultCallback(new ResultCallback<Achievements.LoadAchievementsResult>() { @Override public void onResult(Achievements.LoadAchievementsResult loadAchievementsResult) { Iterator<Achievement> it = loadAchievementsResult.getAchievements().iterator(); AchievementAdapter adapter = new AchievementAdapter(GameFragment.this.getActivity(), R.layout.row_achieve, new ArrayList<Achievement>()); while (it.hasNext()) { adapter.add(it.next()); } ((MyStaggeredGridView) getView().findViewById(R.id.listAchivement)).setAdapter(adapter); } }); } catch (Exception e) { e.printStackTrace(); } setupClosest(); startCountDownThread(); } @Override public void onConnected(Bundle bundle) { setupOk(); } @Override public void onConnectionSuspended(int i) { Log.e("", "SUSPENDED"); } @Override public void onConnectionFailed(ConnectionResult connectionResult) { Log.e("", "FAIL"); } @Override public void onSignInFailed() { Log.e("", "SIGNIN NOK"); } @Override public void onSignInSucceeded() { Log.e("", "SIGNIN OK"); setupOk(); } private String station1; private String station2; private String station3; public void setupClosest() { Log.e("CVE", "CLOSEST"); try { for (StationList.Stationinfo aStation : list.station) { double dDis = Utils.distance( Double.valueOf(aStation.locationX), Double.valueOf(aStation.locationY), me.getLongitude(), me.getLatitude()); aStation.distance = ((int) (dDis * 100)) / 100.0; } Collections.sort(list.station); closest = list.station.get(0); View l = getView().findViewById(R.id.closest1Layout); ((TextView) l.findViewById(R.id.closestTitle)).setText(closest .getStation()); ((TextView) l.findViewById(R.id.closestDesc)) .setText(closest.getDistance()); station1 = closest.getStation(); setupLayout(closest, R.id.closest1Layout); StationList.Stationinfo stationinfo = list.station.get(1); l = getView().findViewById(R.id.closest2Layout); ((TextView) l.findViewById(R.id.closestTitle)).setText(stationinfo .getStation()); ((TextView) l.findViewById(R.id.closestDesc)) .setText(stationinfo.getDistance()); station2 = stationinfo.getStation(); setupLayout(stationinfo, R.id.closest2Layout); stationinfo = list.station.get(2); l = getView().findViewById(R.id.closest3Layout); ((TextView) l.findViewById(R.id.closestTitle)).setText(stationinfo .getStation()); ((TextView) l.findViewById(R.id.closestDesc)) .setText(stationinfo.getDistance()); station3 = stationinfo.getStation(); setupLayout(stationinfo, R.id.closest3Layout); } catch (Exception e) { e.printStackTrace(); } } String id = ""; private void refreshScores() { top = false; Games.Leaderboards.loadCurrentPlayerLeaderboardScore(getApiClient(), LEADER, LeaderboardVariant.TIME_SPAN_WEEKLY, LeaderboardVariant.COLLECTION_PUBLIC).setResultCallback(new ResultCallback<Leaderboards.LoadPlayerScoreResult>() { @Override public void onResult(Leaderboards.LoadPlayerScoreResult loadPlayerScoreResult) { if (loadPlayerScoreResult != null && loadPlayerScoreResult.getScore() != null) { ((TextView) getView().findViewById(R.id.currentuserRank)).setText("" + loadPlayerScoreResult.getScore().getDisplayRank()); newScore = loadPlayerScoreResult.getScore().getRawScore(); ((TextView) getView().findViewById(R.id.currentuserPoints)).setText("" + loadPlayerScoreResult.getScore().getDisplayScore()); } } }); Games.Leaderboards.loadPlayerCenteredScores(getApiClient(), LEADER, LeaderboardVariant.TIME_SPAN_WEEKLY, LeaderboardVariant.COLLECTION_PUBLIC, 25).setResultCallback(new ResultCallback<Leaderboards.LoadScoresResult>() { @Override public void onResult(Leaderboards.LoadScoresResult loadScoresResult) { LeaderboardScoreBuffer leaderboardScores = loadScoresResult.getScores(); try { Iterator<LeaderboardScore> it = leaderboardScores.iterator(); HighScoreAdapter adapter = new HighScoreAdapter(GameFragment.this.getActivity(), R.layout.row_high, new ArrayList<LeaderboardScore>()); while (it.hasNext()) { LeaderboardScore temp = it.next(); adapter.add(temp); } // leaderboardScores.close(); ((GridView) getView().findViewById(R.id.listHighscore)).setAdapter(adapter); } catch (Exception e) { e.printStackTrace(); } } }); } @Override public void onClick(View v) { crouton.cancel(); Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(intent); } @Override public void onLocationChanged(Location location) { me = location; setupClosest(); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } @Override public void onImageLoaded(Uri uri, Drawable drawable, boolean b) { try { ((ImageView) getView().findViewById(R.id.currentprofilePic)).setImageDrawable(drawable); } catch (Exception e) { e.printStackTrace(); } } public class StationList { public class StationsList { public ArrayList<Stationinfo> station; } public class Stationinfo implements Comparable<Object> { public String name; public String locationX; public String locationY; public double distance; @Override public int compareTo(Object toCompare) { return Double.compare(this.distance, ((Stationinfo) (toCompare)).distance); } public CharSequence getDistance() { if (distance > 1) return distance + "km"; else return distance * 1000 + "m"; } public String getStation() { return this.name; } } } private void startCountDownThread() { final Runnable updater = new Runnable() { @Override public void run() { try { if ((System.currentTimeMillis() < PreferenceManager .getDefaultSharedPreferences(GameFragment.this.getActivity()) .getLong("next", 0))) { long delta = PreferenceManager.getDefaultSharedPreferences( GameFragment.this.getActivity()).getLong("next", 0) - System.currentTimeMillis(); int minutes = (int) (delta / DateUtils.MINUTE_IN_MILLIS); int secondes = (int) ((delta % DateUtils.MINUTE_IN_MILLIS) / DateUtils.SECOND_IN_MILLIS); GameFragment.this.getActivity().getActionBar().setTitle( getString(R.string.game_cooling) + minutes + "m" + secondes + "s" ); handler.postDelayed(this, 1000); } else GameFragment.this.getActivity().getActionBar().setTitle(getString(R.string.nav_drawer_game)); } catch (Exception e) { e.printStackTrace(); } } }; handler.post(updater); } public void setupLayout(final StationList.Stationinfo station, int id) { /*new DisplayPointsTask(station,) .execute();*/ final LinearLayout ll = ((LinearLayout) getView().findViewById(id)); String url = "http://api.irail.be/liveboard.php/?station=" + station.getStation().replace(" ", "%20") + "&format=JSON&fast=true"; Ion.with(getActivity()).load(url).as(new TypeToken<Station>() { }).setCallback(new FutureCallback<Station>() { @Override public void onCompleted(Exception e, Station result) { Station.StationDepartures stationDepartures = result.getStationDepartures(); int delay = 0; int num = 1; if (stationDepartures != null) try { for (Station.StationDeparture aDeparture : stationDepartures.getStationDeparture()) { if (!aDeparture.getDelay().contentEquals("0")) { delay += Integer.valueOf(aDeparture.getDelay()); num += 1; } } } catch (Exception e1) { e1.printStackTrace(); } final int total = num; final int i = delay < 60 ? 1 : delay / 60; TextView tv = (TextView) ll.findViewById(R.id.closestTime); tv.setText(getString(R.string.game_station_score) + num); ll.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { if (station.distance > 0.5) { crouton(getString(R.string.game_too_far) + " " + station.getDistance(), Style.ALERT); return; } if ((System.currentTimeMillis() > PreferenceManager .getDefaultSharedPreferences(GameFragment.this.getActivity()) .getLong("next", 0))) { SharedPreferences.Editor e = PreferenceManager .getDefaultSharedPreferences( GameFragment.this.getActivity()).edit(); Games.Achievements.unlock(getApiClient(), CHECKIN); if (i >= 50) Games.Achievements.unlock(getApiClient(), CHECKHUGEDELAY); else if (i >= 20) Games.Achievements.unlock(getApiClient(), CHECKDELAY); newScore += total; e.putLong( "next", (System.currentTimeMillis() + 10 * DateUtils.MINUTE_IN_MILLIS)); e.commit(); Games.Leaderboards.submitScore(getApiClient(), LEADER, newScore); refreshScores(); startCountDownThread(); } else croutonWarn(R.string.game_wait); } }); } }); } private void croutonWarn(int i) { croutonWarn(getString(i)); } private void croutonWarn(String string) { crouton(string, Style.ALERT); } public void debug(String s) { croutonWarn(s); } public void crouton(String text, Style style) { Crouton.makeText(this.getActivity(), text, style, R.id.my_awesome_toolbar).show(); } }