Advertisement
Guest User

Untitled

a guest
Jan 17th, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.81 KB | None | 0 0
  1. package net.cloudninedev.routeplanner;
  2.  
  3. import android.content.Intent;
  4. import android.graphics.Color;
  5. import android.net.Uri;
  6. import android.support.annotation.NonNull;
  7. import android.support.annotation.Nullable;
  8. import android.support.design.widget.FloatingActionButton;
  9. import android.support.v7.app.AppCompatActivity;
  10. import android.os.Bundle;
  11. import android.util.Log;
  12. import android.view.Gravity;
  13. import android.view.Menu;
  14. import android.view.MenuItem;
  15. import android.view.View;
  16. import android.widget.Toast;
  17.  
  18. import com.anjlab.android.iab.v3.BillingProcessor;
  19. import com.anjlab.android.iab.v3.TransactionDetails;
  20. import com.appodeal.ads.Appodeal;
  21. import com.appodeal.ads.InterstitialCallbacks;
  22. import com.google.android.gms.appinvite.AppInviteInvitation;
  23. import com.mapbox.android.core.location.LocationEngine;
  24. import com.mapbox.android.core.location.LocationEngineProvider;
  25. import com.mapbox.api.directions.v5.models.DirectionsResponse;
  26. import com.mapbox.geojson.LineString;
  27. import com.mapbox.geojson.Point;
  28. import com.mapbox.mapboxsdk.Mapbox;
  29. import com.mapbox.mapboxsdk.annotations.MarkerOptions;
  30. import com.mapbox.mapboxsdk.annotations.Polyline;
  31. import com.mapbox.mapboxsdk.annotations.PolylineOptions;
  32. import com.mapbox.mapboxsdk.camera.CameraPosition;
  33. import com.mapbox.mapboxsdk.camera.CameraUpdateFactory;
  34. import com.mapbox.mapboxsdk.geometry.LatLng;
  35. import com.mapbox.mapboxsdk.maps.MapView;
  36. import com.mapbox.mapboxsdk.maps.MapboxMap;
  37. import com.mapbox.mapboxsdk.maps.OnMapReadyCallback;
  38. import com.mapbox.services.android.navigation.ui.v5.NavigationLauncher;
  39. import com.mapbox.services.android.navigation.ui.v5.NavigationLauncherOptions;
  40. import com.mapbox.services.android.navigation.v5.navigation.MapboxNavigation;
  41. import com.mapbox.services.android.navigation.v5.navigation.NavigationRoute;
  42. import com.mapbox.services.api.directions.v5.DirectionsCriteria;
  43. import com.mapbox.services.api.directions.v5.models.DirectionsRoute;
  44. import com.mapbox.services.api.directions.v5.models.DirectionsWaypoint;
  45. import com.mapbox.services.api.optimizedtrips.v1.MapboxOptimizedTrips;
  46. import com.mapbox.services.api.optimizedtrips.v1.models.OptimizedTripsResponse;
  47. import com.mapbox.services.commons.models.Position;
  48.  
  49. import java.util.ArrayList;
  50. import java.util.List;
  51.  
  52. import retrofit2.Call;
  53. import retrofit2.Callback;
  54. import retrofit2.Response;
  55.  
  56. import static com.mapbox.services.Constants.PRECISION_6;
  57.  
  58. public class MapActivity extends AppCompatActivity implements BillingProcessor.IBillingHandler, OnMapReadyCallback {
  59. private MapView mapView;
  60. private MapboxMap mapboxMap;
  61. private DirectionsRoute optimizedRoute;
  62. private MapboxOptimizedTrips optimizedClient;
  63. private Polyline optimizedPolyline;
  64. private List<String> stopAddresses = new ArrayList<String>();
  65. private List<Position> stops = new ArrayList<Position>();
  66.  
  67. private FloatingActionButton fab;
  68. private MapboxNavigation mapboxNavigation;
  69. private LocationEngine locationEngine;
  70. private List<DirectionsWaypoint> optimizedWayponints = new ArrayList<>();
  71.  
  72. private static final String WHITE_COLOR = "#FFFFFF";
  73. private static final int POLYLINE_WIDTH = 5;
  74.  
  75. private static final String PRODUCT_ID = "ad_free";
  76. private BillingProcessor billingProcessor;
  77. private boolean readyToPurchase = false;
  78.  
  79. private static final int REQUEST_INVITE = 1892;
  80.  
  81. @Override
  82. protected void onCreate(Bundle savedInstanceState) {
  83. super.onCreate(savedInstanceState);
  84.  
  85. Appodeal.setTesting(false);
  86. String appKey = "60cc29826cf38be341927f662556b6275bc2727377b2fb59";
  87. Appodeal.initialize(this, appKey, Appodeal.INTERSTITIAL, true);
  88.  
  89. Mapbox.getInstance(this, "pk.eyJ1Ijoid3NhdmVyaWxsIiwiYSI6ImNqbWlueTY4ODA0ODAza2txNzQyMHFhanQifQ.MaPSs93xzh4lJqkf6yBncw");
  90. setContentView(R.layout.activity_map);
  91.  
  92. mapboxNavigation = new MapboxNavigation(this, "pk.eyJ1Ijoid3NhdmVyaWxsIiwiYSI6ImNqbWlueTY4ODA0ODAza2txNzQyMHFhanQifQ.MaPSs93xzh4lJqkf6yBncw");
  93. locationEngine = new LocationEngineProvider(this).obtainBestLocationEngineAvailable();
  94. mapboxNavigation.setLocationEngine(locationEngine);
  95.  
  96. mapView = (MapView) findViewById(R.id.mapView);
  97. mapView.onCreate(savedInstanceState);
  98. mapView.getMapAsync(this);
  99.  
  100. Bundle bundle = getIntent().getExtras();
  101.  
  102. for (int i = 0; i < bundle.getInt("Number of Stops"); i++) {
  103. stopAddresses.add(bundle.getString("Stop " + (i + 1) + " Address"));
  104. stops.add(Position.fromCoordinates(bundle.getDouble("Stop " + (i + 1) + " Longitude"), bundle.getDouble("Stop " + (i + 1) + " Latitude")));
  105. }
  106.  
  107. fab = findViewById(R.id.fab);
  108. fab.setOnClickListener(new View.OnClickListener() {
  109.  
  110. @Override
  111. public void onClick(View view) {
  112. NavigationRoute.Builder builder = NavigationRoute.builder(getApplicationContext())
  113. .accessToken(Mapbox.getAccessToken())
  114. .origin(Point.fromLngLat(optimizedWayponints.get(0).asPosition().getLongitude(), optimizedWayponints.get(0).asPosition().getLatitude()))
  115. .destination(Point.fromLngLat(optimizedWayponints.get(optimizedWayponints.size()-1).asPosition().getLongitude(), optimizedWayponints.get(optimizedWayponints.size()-1).asPosition().getLatitude()))
  116. .profile(DirectionsCriteria.PROFILE_DRIVING);
  117.  
  118. for (int i = 1; i < optimizedWayponints.size()-1; i++) {
  119. builder.addWaypoint(Point.fromLngLat(optimizedWayponints.get(i).asPosition().getLongitude(), optimizedWayponints.get(i).asPosition().getLatitude()));
  120. }
  121.  
  122. builder.build().getRoute(new Callback<DirectionsResponse>() {
  123.  
  124. @Override
  125. public void onResponse(Call<DirectionsResponse> call, Response<DirectionsResponse> response) {
  126. NavigationLauncherOptions options = NavigationLauncherOptions.builder()
  127. .directionsRoute(response.body().routes().get(0))
  128. .shouldSimulateRoute(false)
  129. .build();
  130.  
  131. NavigationLauncher.startNavigation(MapActivity.this, options);
  132. }
  133.  
  134. @Override
  135. public void onFailure(Call<DirectionsResponse> call, Throwable t) {
  136.  
  137. }
  138. });
  139. }
  140. });
  141.  
  142. if (!BillingProcessor.isIabServiceAvailable(this)) {
  143. Toast toast = Toast.makeText(getApplicationContext(), getString(R.string.billing_service_unavailable), Toast.LENGTH_LONG);
  144. toast.setGravity(Gravity.CENTER, 0, 0);
  145. toast.show();
  146. }
  147.  
  148. billingProcessor = new BillingProcessor(this, getString(R.string.license_key), null, this);
  149. }
  150.  
  151. @Override
  152. public void onProductPurchased(@NonNull String productId, @Nullable TransactionDetails details) {
  153.  
  154. if (billingProcessor.isPurchased(PRODUCT_ID)) {
  155. hideAd();
  156. } else {
  157. showAd();
  158. }
  159. }
  160.  
  161. @Override
  162. public void onBillingError(int errorCode, @Nullable Throwable error) {
  163.  
  164. if (error != null) {
  165. error.printStackTrace();
  166. }
  167. }
  168.  
  169. @Override
  170. public void onBillingInitialized() {
  171.  
  172. if (billingProcessor.isPurchased(PRODUCT_ID)) {
  173. hideAd();
  174. } else {
  175. showAd();
  176. }
  177. }
  178.  
  179. @Override
  180. public void onPurchaseHistoryRestored() {
  181.  
  182. for (String sku : billingProcessor.listOwnedProducts()) {
  183.  
  184. if (sku.equals(PRODUCT_ID)) {
  185. hideAd();
  186. }
  187. }
  188. }
  189.  
  190. @Override
  191. public boolean onCreateOptionsMenu(Menu menu) {
  192. getMenuInflater().inflate(R.menu.menu_map, menu);
  193.  
  194. return super.onCreateOptionsMenu(menu);
  195. }
  196.  
  197. @Override
  198. public boolean onPrepareOptionsMenu(Menu menu) {
  199. final boolean show = super.onPrepareOptionsMenu(menu);
  200. menu.findItem(R.id.shopping_cart).setEnabled(readyToPurchase);
  201.  
  202. return show;
  203. }
  204.  
  205. @Override
  206. public boolean onOptionsItemSelected(MenuItem item) {
  207.  
  208. switch (item.getItemId()) {
  209.  
  210. case R.id.shopping_cart:
  211. buyAdFree();
  212.  
  213. return true;
  214.  
  215. case R.id.share:
  216. Intent intent = new AppInviteInvitation.IntentBuilder(getString(R.string.invitation_title))
  217. .setMessage(getString(R.string.invitation_message))
  218. .setDeepLink(Uri.parse(getString(R.string.invitation_deep_link)))
  219. .build();
  220. startActivityForResult(intent, REQUEST_INVITE);
  221.  
  222. return true;
  223.  
  224. case R.id.privacy_policy:
  225. Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://leveltap.wixsite.com/routeplanner"));
  226. startActivity(browserIntent);
  227.  
  228. return true;
  229.  
  230. default:
  231.  
  232. return super.onOptionsItemSelected(item);
  233. }
  234. }
  235.  
  236. @Override
  237. public void onMapReady(MapboxMap mapboxMap) {
  238. MapActivity.this.mapboxMap = mapboxMap;
  239.  
  240. CameraPosition position = new CameraPosition.Builder()
  241. .target(new LatLng(stops.get(0).getLatitude(), stops.get(0).getLongitude()))
  242. .zoom(10)
  243. .bearing(0)
  244. .tilt(0)
  245. .build();
  246.  
  247. mapboxMap.animateCamera(CameraUpdateFactory.newCameraPosition(position), 1000);
  248.  
  249. for (int i = 0; i < stops.size(); i++) {
  250. mapboxMap.addMarker(new MarkerOptions()
  251. .position(new LatLng(stops.get(i).getLatitude(),stops.get(i).getLongitude()))
  252. .title("" + (i+1))
  253. .snippet(stopAddresses.get(i)));
  254. }
  255.  
  256. optimizedClient = new MapboxOptimizedTrips.Builder()
  257. .setProfile(DirectionsCriteria.PROFILE_DRIVING)
  258. .setAccessToken(Mapbox.getAccessToken())
  259. .setCoordinates(new ArrayList<Position>(stops))
  260. .build();
  261.  
  262. optimizedClient.enqueueCall(new Callback<OptimizedTripsResponse>() {
  263.  
  264. @Override
  265. public void onResponse(Call<OptimizedTripsResponse> call, Response<OptimizedTripsResponse> response) {
  266. if (!response.isSuccessful()) {
  267. Log.d("MapActivity", getString(R.string.no_success));
  268. Toast.makeText(MapActivity.this, R.string.no_success, Toast.LENGTH_SHORT).show();
  269. return;
  270. } else {
  271. if (response.body().getTrips().isEmpty()) {
  272. Log.d("MapActivity", getString(R.string.successful_but_no_routes) + " size = "
  273. + response.body().getTrips().size());
  274. Toast.makeText(MapActivity.this, R.string.successful_but_no_routes,
  275. Toast.LENGTH_SHORT).show();
  276. return;
  277. }
  278. }
  279.  
  280. // Get most optimized route from API response
  281. optimizedRoute = response.body().getTrips().get(0);
  282. drawOptimizedRoute(optimizedRoute);
  283.  
  284. for (int i = 0; i < response.body().getWaypoints().size(); i++) {
  285. optimizedWayponints.add(response.body().getWaypoints().get(i));
  286. }
  287. }
  288.  
  289. @Override
  290. public void onFailure(Call<OptimizedTripsResponse> call, Throwable throwable) {
  291. Log.d("DirectionsActivity", "Error: " + throwable.getMessage());
  292. }
  293. });
  294. }
  295.  
  296. private void buyAdFree() {
  297. billingProcessor.purchase(this, PRODUCT_ID);
  298. }
  299.  
  300. private void drawOptimizedRoute(DirectionsRoute route) {
  301. // Remove old polyline
  302. if (optimizedPolyline != null) {
  303. mapboxMap.removePolyline(optimizedPolyline);
  304. }
  305. // Draw points on MapView
  306. LatLng[] pointsToDraw = convertLineStringToLatLng(route);
  307. optimizedPolyline = mapboxMap.addPolyline(new PolylineOptions()
  308. .add(pointsToDraw)
  309. .color(Color.parseColor(WHITE_COLOR))
  310. .width(POLYLINE_WIDTH));
  311. }
  312.  
  313. private LatLng[] convertLineStringToLatLng(DirectionsRoute route) {
  314. // Convert LineString coordinates into LatLng[]
  315. LineString lineString = LineString.fromPolyline(route.getGeometry(), PRECISION_6);
  316. List<Point> coordinates = lineString.coordinates();
  317. LatLng[] points = new LatLng[coordinates.size()];
  318. for (int i = 0; i < coordinates.size(); i++) {
  319. points[i] = new LatLng(
  320. coordinates.get(i).latitude(),
  321. coordinates.get(i).longitude());
  322. }
  323. return points;
  324. }
  325.  
  326. @Override
  327. public void onStart() {
  328. super.onStart();
  329.  
  330. mapView.onStart();
  331. }
  332.  
  333. @Override
  334. public void onResume() {
  335. super.onResume();
  336.  
  337. mapView.onResume();
  338.  
  339. if (billingProcessor.isPurchased(PRODUCT_ID)) {
  340. hideAd();
  341. } else {
  342. showAd();
  343. }
  344. }
  345.  
  346. @Override
  347. public void onPause() {
  348. super.onPause();
  349.  
  350. mapView.onPause();
  351. }
  352.  
  353. @Override
  354. public void onStop() {
  355. super.onStop();
  356.  
  357. mapView.onStop();
  358. }
  359.  
  360. @Override
  361. public void onLowMemory() {
  362. super.onLowMemory();
  363.  
  364. mapView.onLowMemory();
  365. }
  366.  
  367. @Override
  368. protected void onDestroy() {
  369. super.onDestroy();
  370.  
  371. if (mapView != null) {
  372. mapView.onDestroy();
  373. }
  374.  
  375. // Cancel the directions API request
  376. if (optimizedClient != null) {
  377. optimizedClient.cancelCall();
  378. }
  379.  
  380. // End the navigation session
  381. if (mapboxNavigation != null) {
  382. mapboxNavigation.stopNavigation();
  383. mapboxNavigation.onDestroy();
  384. }
  385.  
  386. if (billingProcessor != null) {
  387. billingProcessor.release();
  388. }
  389. }
  390.  
  391. @Override
  392. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  393.  
  394. if (!billingProcessor.handleActivityResult(requestCode, resultCode, data)) {
  395. super.onActivityResult(requestCode, resultCode, data);
  396. }
  397. }
  398.  
  399. @Override
  400. protected void onSaveInstanceState(Bundle outState) {
  401. super.onSaveInstanceState(outState);
  402.  
  403. mapView.onSaveInstanceState(outState);
  404. }
  405.  
  406. private void showAd() {
  407. readyToPurchase = true;
  408. Appodeal.setInterstitialCallbacks(new InterstitialCallbacks() {
  409. @Override
  410. public void onInterstitialLoaded(boolean isPrecache) {
  411. Log.d("Appodeal", "onInterstitialLoaded");
  412. Appodeal.show(MapActivity.this, Appodeal.INTERSTITIAL);
  413. }
  414. @Override
  415. public void onInterstitialFailedToLoad() {
  416. Log.d("Appodeal", "onInterstitialFailedToLoad");
  417. }
  418. @Override
  419. public void onInterstitialShown() {
  420. Log.d("Appodeal", "onInterstitialShown");
  421. }
  422. @Override
  423. public void onInterstitialClicked() {
  424. Log.d("Appodeal", "onInterstitialClicked");
  425. }
  426. @Override
  427. public void onInterstitialClosed() {
  428. Log.d("Appodeal", "onInterstitialClosed");
  429. }
  430. @Override
  431. public void onInterstitialExpired() {
  432. Log.d("Appodeal", "onInterstitialExpired");
  433. }
  434. });
  435. }
  436.  
  437. private void hideAd() {
  438. readyToPurchase = false;
  439. }
  440. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement