/[aagtl_public1]/src/com/zoffcc/applications/aagtl/Rose.java
aagtl

Contents of /src/com/zoffcc/applications/aagtl/Rose.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4 - (hide annotations) (download)
Sat Aug 1 08:47:10 2015 UTC (8 years, 8 months ago) by zoffadmin
File size: 56709 byte(s)
1.0.35
1 zoffadmin 2 /**
2     * aagtl Advanced Geocaching Tool for Android
3     * loosely based on agtl by Daniel Fett <fett@danielfett.de>
4 zoffadmin 3 * Copyright (C) 2010 - 2012 Zoff <aagtl@work.zoff.cc>
5 zoffadmin 2 *
6     * This program is free software; you can redistribute it and/or
7     * modify it under the terms of the GNU General Public License
8     * version 2 as published by the Free Software Foundation.
9     *
10     * This program is distributed in the hope that it will be useful,
11     * but WITHOUT ANY WARRANTY; without even the implied warranty of
12     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13     * GNU General Public License for more details.
14     *
15     * You should have received a copy of the GNU General Public License
16     * along with this program; if not, write to the
17     * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18     * Boston, MA 02110-1301, USA.
19     */
20    
21     package com.zoffcc.applications.aagtl;
22    
23     import java.io.FileNotFoundException;
24     import java.util.ArrayList;
25     import java.util.List;
26    
27     import android.content.Context;
28     import android.graphics.Bitmap;
29     import android.graphics.Canvas;
30     import android.graphics.Color;
31     import android.graphics.Paint;
32     import android.graphics.PointF;
33     import android.graphics.RectF;
34     import android.util.FloatMath;
35     import android.util.Log;
36     import android.view.MotionEvent;
37     import android.view.SurfaceHolder;
38     import android.view.SurfaceView;
39     import android.view.View;
40     import android.view.View.OnTouchListener;
41    
42     public class Rose extends SurfaceView implements OnTouchListener, SurfaceHolder.Callback
43     {
44    
45     ImageManager im;
46     int newx = 0, newy = 0;
47     int deltax = 0, deltay = 0;
48     int prev_x = 0, prev_y = 0;
49     int direction = 0;
50     boolean start_move = false;
51     static final int more_for_speed_x = 0;
52     static final int more_for_speed_y = 0;
53     static final int TOUCH_CACHE_RADIUS = 35;
54    
55     static final int NONE = 0;
56     static final int DRAG = 1;
57     static final int ZOOM = 2;
58     static final int PRESS = 3;
59     int touch_mode = NONE;
60     float oldDist = 0;
61    
62     PointF touch_now = new PointF(0, 0);
63     PointF touch_start = new PointF(0, 0);
64     PointF touch_prev = new PointF(0, 0);
65     PointF touch_last_load_tiles = new PointF(0, 0);
66     double map_center_x_before_move = 0;
67     double map_center_y_before_move = 0;
68     double map_heading_prev = 0;
69     double map_heading_start = 0;
70     double map_heading_last_load_tiles = 0;
71    
72     //
73     //
74     //
75     static boolean use_parent_tiles = true;
76     //
77     //
78     //
79    
80     public Boolean redraw_notify = false;
81    
82     static final int larger_offset_x = 100;
83     static final int larger_offset_y = 100;
84    
85     int tile_size_x = 256;
86     int tile_size_y = 256;
87 zoffadmin 4 int tile_size_x_real_ = 256;
88     int tile_size_y_real_ = 256;
89 zoffadmin 2 int num_tiles_x = 0;
90     int num_tiles_y = 0;
91     double map_center_x = 0.0;
92     double map_center_y = 0.0;
93     int zoom = 0;
94     Coordinate center_coord = null;
95     GeocacheCoordinate current_target = null;
96    
97     public int mCanvasHeight = 1;
98     public int mCanvasWidth = 1;
99    
100     Bitmap bitmap_main = null;
101     Canvas image_main = null;
102     Paint mainpaint = null;
103     Paint rectpaint = null;
104    
105     Bitmap bitmap1 = null;
106     Bitmap bitmap2 = null;
107     Bitmap bitmap3 = null;
108     Bitmap bitmap4 = null;
109     Bitmap bitmap5 = null;
110     Bitmap bitmap6 = null;
111    
112     Bitmap[][] map_tiles_onscreen = null;
113     String[][] map_tile_filename = null;
114     int[][][] map_tile_num_onscreen = null;
115     Bitmap[][] copy_bitmaps = null;
116     int[][][] copy_tiles = null;
117     Bitmap[] map_tiles_cache = null;
118     Bitmap[] map_tiles_parent_cache = null;
119     int[][] map_tiles_caches_values = null;
120     int[][] map_tiles_parent_caches_values = null;
121     int map_tiles_cache_oldest_counter = 0;
122     int map_tiles_parent_cache_oldest_counter = 0;
123     static final int map_tiles_cache_size = 15 * 3;
124     static final int map_tiles_parent_cache_size = 15 * 4;
125    
126     List<Integer> yit = new ArrayList<Integer>();
127     List<Integer> xit = new ArrayList<Integer>();
128    
129     aagtl main_object;
130    
131     /** Handle to the surface manager object we interact with */
132     private SurfaceHolder mSurfaceHolder;
133    
134     public static final int STATE_LOSE = 1;
135     public static final int STATE_PAUSE = 2;
136     public static final int STATE_READY = 3;
137     public static final int STATE_RUNNING = 4;
138     public static final int STATE_WIN = 5;
139    
140     public static final int TILE_NULL = -1;
141     public static final int TILE_LOADING = 0;
142     public static final int TILE_LOADED_NEW = 1;
143     public static final int TILE_LOADED_DRAWN = 2;
144    
145     public double[] deg2num(Coordinate coord)
146     {
147     double[] f_ret = new double[2];
148     f_ret[0] = (coord.lon + 180) / 360 * (1 << zoom);
149     f_ret[1] = (1 - Math.log(Math.tan(Math.toRadians(coord.lat)) + 1 / Math.cos(Math.toRadians(coord.lat))) / Math.PI) / 2 * (1 << zoom);
150     // return --> tile_x,tile_y
151     return f_ret;
152     }
153    
154     public double[] deg2num_give_zoom(Coordinate coord, int zoom2)
155     {
156     double[] f_ret = new double[2];
157     f_ret[0] = (coord.lon + 180) / 360 * (1 << zoom2);
158     f_ret[1] = (1 - Math.log(Math.tan(Math.toRadians(coord.lat)) + 1 / Math.cos(Math.toRadians(coord.lat))) / Math.PI) / 2 * (1 << zoom2);
159     // return --> tile_x,tile_y
160     return f_ret;
161     }
162    
163     public Coordinate num2deg(double xtile, double ytile)
164     {
165     double n = (1 << this.zoom);
166     double lon_deg = xtile / n * 360.0 - 180.0;
167     double lat_rad = Math.atan(Math.sinh(Math.PI * (1 - 2 * ytile / n)));
168     double lat_deg = lat_rad * 180.0 / Math.PI;
169    
170     Coordinate ret = new Coordinate(lat_deg, lon_deg);
171     return ret;
172     }
173    
174     public Coordinate num2deg_give_zoom(double xtile, double ytile, int zoom2)
175     {
176     double n = (1 << zoom2);
177     double lon_deg = xtile / n * 360.0 - 180.0;
178     double lat_rad = Math.atan(Math.sinh(Math.PI * (1 - 2 * ytile / n)));
179     double lat_deg = lat_rad * 180.0 / Math.PI;
180    
181     Coordinate ret = new Coordinate(lat_deg, lon_deg);
182     return ret;
183     }
184    
185     public void set_center(Coordinate coord)
186     {
187     double[] f_arr = new double[2];
188     f_arr = deg2num(coord);
189     this.map_center_x = f_arr[0];
190     this.map_center_y = f_arr[1];
191     // System.out.println("set_center: " + map_center_x);
192     // System.out.println("set_center: " + map_center_y);
193     // System.out.println("set_center: " + coord.lat);
194     // System.out.println("set_center: " + coord.lon);
195     this.main_object.set_center(coord.lat, coord.lon);
196     }
197    
198     synchronized public void __calc_tiles_on_display()
199     {
200     int xi = (int) map_center_x;
201     int yi = (int) map_center_y;
202    
203     // long a = android.os.SystemClock.elapsedRealtime();
204     // make copies
205     if ((map_tiles_onscreen != null) && (map_tile_num_onscreen != null))
206     {
207     // System.out.println(String.valueOf(map_tiles_onscreen.length));
208     // System.out.println(String.valueOf(map_tile_num_onscreen.length));
209     for (int y = 0; y < map_tiles_onscreen.length; y++)
210     for (int x = 0; x < map_tiles_onscreen[y].length; x++)
211     {
212     // System.out.println(String.valueOf(map_tiles_onscreen[y][x]));
213     copy_bitmaps[y][x] = map_tiles_onscreen[y][x];
214     }
215    
216     for (int y = 0; y < map_tile_num_onscreen.length; y++)
217     for (int x = 0; x < map_tile_num_onscreen[y].length; x++)
218     for (int z = 0; z < 3; z++)
219     {
220     // System.out.println(String.valueOf(map_tile_num_onscreen[y][x][z]));
221     copy_tiles[y][x][z] = map_tile_num_onscreen[y][x][z];
222     }
223     }
224    
225     // System.out.println("1:" +
226     // String.valueOf(android.os.SystemClock.elapsedRealtime() - a));
227     // a = android.os.SystemClock.elapsedRealtime();
228    
229     int i;
230     int j;
231     int s_x = xit.size();
232     int s_y = yit.size();
233     for (int m = 0; m < s_x; m++)
234     // for (int m = s_x - 1; m > -1; m--)
235     {
236     if (m % 2 == 0)
237     {
238     // even
239     int n = m / 2;
240     i = ((Integer) xit.get(n)).intValue();
241     }
242     else
243     {
244     // odd
245     int n = m / 2;
246     n = (s_x - 1) - n;
247     i = ((Integer) xit.get(n)).intValue();
248     }
249    
250     for (int k = 0; k < s_y; k++)
251     // for (int k = s_y - 1; k > -1; k--)
252     {
253     if (k % 2 == 0)
254     {
255     // even
256     int n2 = k / 2;
257     j = ((Integer) xit.get(n2)).intValue();
258     }
259     else
260     {
261     // odd
262     int n2 = k / 2;
263     n2 = (s_y - 1) - n2;
264     j = ((Integer) yit.get(n2)).intValue();
265     }
266    
267     int ww_2 = ((int) (num_tiles_x / 2)) + 1;
268     int hh_2 = ((int) (num_tiles_y / 2)) + 1;
269     int xx = xi + i - (ww_2);
270     int yy = yi + j - (hh_2);
271    
272     // System.out.println(String.valueOf(i));
273     // System.out.println(String.valueOf(j));
274     // System.out.println(String.valueOf(ww_2));
275     // System.out.println(String.valueOf(hh_2));
276     // System.out.println(String.valueOf(xx));
277     // System.out.println(String.valueOf(yy));
278     // System.out.println(String.valueOf(xi));
279     // System.out.println(String.valueOf(yi));
280    
281     // long b = android.os.SystemClock.elapsedRealtime();
282    
283     check_tile(main_object.global_settings.map_type, zoom, xx, yy, i, j);
284    
285     // System.out.println("b:" +
286     // String.valueOf(android.os.SystemClock.elapsedRealtime() -
287     // b));
288    
289     }
290     }
291    
292     // System.out.println("2:" +
293     // String.valueOf(android.os.SystemClock.elapsedRealtime() - a));
294    
295     }
296    
297     public void change_map_type(int new_map_type)
298     {
299     main_object.global_settings.map_type = new_map_type;
300     // this.main_object.gcview.clear_stuff(); // not need
301     this.clear_stuff();
302     this.clear_stuff_2();
303     this.main_object.mdl.clear_stuff();
304     __calc_tiles_on_display();
305     draw_me();
306     // this.main_object.gcview.invalidate(); // not need
307     }
308    
309     synchronized public void check_tile(int map_type, int zoom, int xx, int yy, int i, int j)
310     {
311     if (map_tile_num_onscreen == null)
312     {
313     return;
314     }
315    
316     try
317     {
318     // System.out.println("" + (i - 1) + " " + (j - 1));
319     map_tile_num_onscreen[i - 1][j - 1][0] = xx;
320     map_tile_num_onscreen[i - 1][j - 1][1] = yy;
321     map_tile_filename[i - 1][j - 1] = this.main_object.mdl.get_local_url(map_type, zoom, xx, yy);
322    
323     Boolean showing_parent = false;
324    
325     Boolean found_it = false;
326     // decide where to get the tile from:
327     // 1.1 Memory ~10ms
328     // 1.2 Memory Cache ~10ms
329     // 2. File ~40ms
330     // 3. Internet background operation
331     // 3.x Parent tile on disk (optional) -> use_parent_tiles = t/f
332    
333     for (int a = 0; a < copy_tiles.length; a++)
334     for (int b = 0; b < copy_tiles[a].length; b++)
335     {
336     if ((copy_tiles[a][b][0] == xx) && (copy_tiles[a][b][1] == yy))
337     {
338     // ok found it in memory
339     if (copy_bitmaps[a][b] != null)
340     {
341     if (CacheDownloader.DEBUG_) System.out.println("found it in memory");
342     map_tiles_onscreen[i - 1][j - 1] = copy_bitmaps[a][b];
343     // set to loaded
344     map_tile_num_onscreen[i - 1][j - 1][2] = TILE_LOADED_DRAWN;
345     found_it = true;
346     break;
347     }
348     }
349     }
350    
351     if (!found_it)
352     {
353     Bitmap dummy_bitmap = get_tile_from_map_tile_cache(xx, yy);
354     if (dummy_bitmap != null)
355     {
356     // ok found it in big Bitmap cache
357     if (CacheDownloader.DEBUG_) System.out.println("found it in bitmap cache");
358     found_it = true;
359     map_tiles_onscreen[i - 1][j - 1] = dummy_bitmap;
360     // set to loaded
361     map_tile_num_onscreen[i - 1][j - 1][2] = TILE_LOADED_DRAWN;
362     }
363     }
364    
365     if (!found_it)
366     {
367     String l_url = this.main_object.mdl.get_local_url(map_type, zoom, xx, yy);
368     Boolean is_dled = this.main_object.mdl.is_downloaded(l_url);
369     if (is_dled)
370     {
371     try
372     {
373     if (CacheDownloader.DEBUG_) System.out.println("found it on disk");
374     map_tiles_onscreen[i - 1][j - 1] = this.main_object.mdl.get_bitmap_from_local_url(l_url);
375     // add to big Bitmap cache, only if NOT in
376     add_to_map_tile_cache(map_tiles_onscreen[i - 1][j - 1], xx, yy);
377     // System.out.println(String.valueOf(map_tiles_onscreen[i
378     // - 1][j - 1]));
379     map_tile_num_onscreen[i - 1][j - 1][2] = TILE_LOADED_NEW;
380     }
381     catch (Exception e)
382     {
383    
384     }
385     }
386     else
387     {
388     if (CacheDownloader.DEBUG_) System.out.println("11 start downloading tile in background thread");
389     //
390     //
391     // meanwhile see if we have parent tile on disk
392     if ((this.zoom > 2) && (use_parent_tiles))
393     {
394     if (CacheDownloader.DEBUG_) System.out.println("loading parent tile");
395     int less_zoom = zoom - 1;
396     Coordinate coord1 = this.num2deg(xx, yy);
397     double[] this_tile2 = new double[2];
398     this_tile2 = this.deg2num_give_zoom(coord1, less_zoom);
399     int this_tile3_x = (int) (this_tile2[0] + 0.001); // rounding fix!
400     int this_tile3_y = (int) (this_tile2[1] + 0.001); // rounding fix!
401    
402     String[] new_file_names = this.main_object.mdl.get_remote_url(map_type, less_zoom, this_tile3_x, this_tile3_y);
403     String l_low = new_file_names[1];
404    
405     // first look in parent bitmap cache for parent tile
406     Boolean is_in_parent_bitmap_cache = false;
407     Bitmap parent_tile = get_tile_from_map_tile_parent_cache(xx, yy);
408     if (parent_tile != null)
409     {
410     is_in_parent_bitmap_cache = true;
411     if (CacheDownloader.DEBUG_) System.out.println("found parent tile in bitmap cache");
412     }
413     else
414     {
415     Boolean is_dled_parent = this.main_object.mdl.is_downloaded(l_low);
416     if (CacheDownloader.DEBUG_) System.out.println("found parent tile on disk");
417     if (is_dled_parent)
418     {
419     if (CacheDownloader.DEBUG_) System.out.println("loading parent tile from disk");
420     try
421     {
422     parent_tile = this.main_object.mdl.get_bitmap_from_local_url(l_low);
423     }
424     catch (FileNotFoundException e)
425     {
426     if (CacheDownloader.DEBUG_) System.out.println("++parent tile, file not found++");
427     }
428     }
429     else
430     {
431     if (CacheDownloader.DEBUG_) System.out.println("**parent tile not here**");
432     }
433     }
434    
435     if (parent_tile != null)
436     {
437     Bitmap quarter_tile = null;
438     if (!is_in_parent_bitmap_cache)
439     {
440     // resize tile
441     int new_size_x = this.tile_size_x * 2;
442     int new_size_y = this.tile_size_y * 2;
443 zoffadmin 4 Bitmap parent_tile_scaled;
444     //parent_tile.setDensity(aagtl.Global_want_dpi);
445     parent_tile_scaled = Bitmap.createScaledBitmap(parent_tile, new_size_x, new_size_y, false);
446     parent_tile_scaled.setDensity(aagtl.Global_real_dpi);
447 zoffadmin 2 //
448     int x_diff = 0;
449     int y_diff = 0;
450     if ((this_tile2[0] - this_tile3_x) > 0.1)
451     {
452     x_diff = this.tile_size_x;
453     }
454    
455     else
456     {
457     x_diff = 0;
458     }
459     if ((this_tile2[1] - this_tile3_y) > 0.1)
460     {
461     y_diff = this.tile_size_y;
462     }
463     else
464     {
465     y_diff = 0;
466     }
467    
468     // System.out.println("x_diff=" + x_diff);
469     // System.out.println("y_diff=" + y_diff);
470     // System.out.println("this_tile3_x=" +
471     // this_tile3_x);
472     // System.out.println("this_tile3_y=" +
473     // this_tile3_y);
474     // System.out.println("this_tile2[0]=" +
475     // this_tile2[0]);
476     // System.out.println("this_tile2[1]=" +
477     // this_tile2[1]);
478    
479     quarter_tile = Bitmap.createBitmap(parent_tile_scaled, x_diff, y_diff, this.tile_size_x, this.tile_size_y);
480    
481     add_to_map_tile_parent_cache(quarter_tile, xx, yy);
482     }
483     else
484     {
485     // parent_tile from bitmap cache is already the quarter tile!!
486     quarter_tile = parent_tile;
487     }
488    
489     add_to_map_tile_cache(null, xx, yy);
490     map_tiles_onscreen[i - 1][j - 1] = quarter_tile;
491     map_tile_num_onscreen[i - 1][j - 1][2] = TILE_LOADING;
492    
493     showing_parent = true;
494     }
495     }
496     if (CacheDownloader.DEBUG_) System.out.println("22 start downloading tile in background thread");
497     //
498     //
499     //
500     if (showing_parent)
501     {
502     if (CacheDownloader.DEBUG_) System.out.println("-- showing parent");
503     }
504     else
505     {
506     if (CacheDownloader.DEBUG_) System.out.println("-- NOT showing parent");
507     // System.out.println("bb1" + map_type + " " + zoom + " " + xx + " "
508     // + yy);
509     // Reset the Bitmap to null value
510     map_tiles_onscreen[i - 1][j - 1] = null;
511     map_tile_num_onscreen[i - 1][j - 1][2] = TILE_LOADING;
512     }
513     main_object.mdl.append_tile_to_list(map_type, zoom, xx, yy);
514     }
515     }
516     }
517     catch (Exception e)
518     {
519     if (CacheDownloader.DEBUG_) System.out.println("check_tile: Exception1");
520     }
521    
522     }
523    
524     synchronized public void add_to_map_tile_cache(Bitmap b, int tile_x, int tile_y)
525     {
526     int dummy2 = map_tiles_cache_oldest_counter;
527     int dummy3 = dummy2;
528     dummy2++;
529     if (dummy2 > map_tiles_cache_size - 1)
530     {
531     dummy2 = 0;
532     }
533     map_tiles_cache_oldest_counter = dummy2;
534     map_tiles_cache[dummy3] = b;
535     map_tiles_caches_values[dummy3][0] = tile_x;
536     map_tiles_caches_values[dummy3][1] = tile_y;
537    
538     }
539    
540     synchronized public void add_to_map_tile_parent_cache(Bitmap b, int tile_x, int tile_y)
541     {
542     int dummy2 = map_tiles_parent_cache_oldest_counter;
543     int dummy3 = dummy2;
544     dummy2++;
545     if (dummy2 > map_tiles_parent_cache_size - 1)
546     {
547     dummy2 = 0;
548     }
549     map_tiles_parent_cache_oldest_counter = dummy2;
550     map_tiles_parent_cache[dummy3] = b;
551     map_tiles_parent_caches_values[dummy3][0] = tile_x;
552     map_tiles_parent_caches_values[dummy3][1] = tile_y;
553    
554     }
555    
556     public Bitmap get_tile_from_map_tile_parent_cache(int tile_x, int tile_y)
557     {
558     Bitmap ret = null;
559     for (int dummy = 0; dummy < map_tiles_parent_cache_size; dummy++)
560     {
561     if ((map_tiles_parent_caches_values[dummy][0] == tile_x) && (map_tiles_parent_caches_values[dummy][1] == tile_y))
562     {
563     ret = map_tiles_parent_cache[dummy];
564     break;
565     }
566     }
567     return ret;
568     }
569    
570     public Bitmap get_tile_from_map_tile_cache(int tile_x, int tile_y)
571     {
572     Bitmap ret = null;
573     for (int dummy = 0; dummy < map_tiles_cache_size; dummy++)
574     {
575     if ((map_tiles_caches_values[dummy][0] == tile_x) && (map_tiles_caches_values[dummy][1] == tile_y))
576     {
577     ret = map_tiles_cache[dummy];
578     break;
579     }
580     }
581     return ret;
582     }
583    
584     public void notify_tile_loaded_new(String local_filename)
585     {
586     // System.out.println("lf: " + local_filename);
587     Boolean must_redraw = false;
588     // synchronized (map_tile_num_onscreen)
589     // {
590     for (int a = 0; a < map_tile_num_onscreen.length; a++)
591     for (int b = 0; b < map_tile_num_onscreen[a].length; b++)
592     {
593     // System.out.println("lf search: " + map_tile_filename[a][b]);
594     if (map_tile_filename[a][b].equals(local_filename))
595     {
596     if (this.main_object.mdl.is_downloaded(local_filename))
597     {
598     try
599     {
600     map_tile_num_onscreen[a][b][2] = TILE_LOADED_NEW;
601     // refresh it from disk!
602     map_tiles_onscreen[a][b] = this.main_object.mdl.get_bitmap_from_local_url(local_filename);
603     must_redraw = true;
604     // System.out.println("tile loaded!!");
605     }
606     catch (FileNotFoundException e)
607     {
608    
609     }
610     }
611     }
612     }
613    
614     if (must_redraw)
615     {
616     // only draw if we are NOT in drag mode right now!
617     if (touch_mode != DRAG)
618     {
619     draw_me();
620     }
621     else
622     {
623     redraw_notify = true;
624     // System.out.println("redraw_notify ON 1");
625     }
626     }
627     // }
628    
629     }
630    
631 zoffadmin 4 public void free_stuff()
632     {
633    
634     //System.out.println("AAGTL:free_stuff:001");
635     aagtl.logHeap(this.getClass());
636    
637     try
638     {
639     for (int dummy = 0; dummy < map_tiles_cache_size; dummy++)
640     {
641     try
642     {
643     map_tiles_cache[dummy].recycle();
644     map_tiles_cache[dummy] = null;
645     }
646     catch (Exception e)
647     {
648     //e.printStackTrace();
649     }
650     }
651     for (int dummy = 0; dummy < map_tiles_parent_cache_size; dummy++)
652     {
653     try
654     {
655     map_tiles_parent_cache[dummy].recycle();
656     map_tiles_parent_cache[dummy] = null;
657     }
658     catch (Exception e)
659     {
660     //e.printStackTrace();
661     }
662     }
663     }
664     catch (Exception e)
665     {
666     //e.printStackTrace();
667     }
668    
669     try
670     {
671     for (int y = 0; y < map_tiles_onscreen.length; y++)
672     for (int x = 0; x < map_tiles_onscreen[y].length; x++)
673     {
674     try
675     {
676     //System.out.println("AAGTL:free_stuff:" + y + " " + x + " " + String.valueOf(map_tiles_onscreen[y][x]));
677     map_tiles_onscreen[y][x].recycle();
678     map_tiles_onscreen[y][x] = null;
679     }
680     catch (Exception e)
681     {
682     //e.printStackTrace();
683     }
684     }
685     }
686     catch (Exception e)
687     {
688     //e.printStackTrace();
689     }
690    
691     try
692     {
693     for (int y = 0; y < map_tiles_onscreen.length; y++)
694     {
695     for (int x = 0; x < map_tiles_onscreen[y].length; x++)
696     {
697     try
698     {
699     //System.out.println("AAGTL:free_stuff:" + y + " " + x + " " + String.valueOf(copy_bitmaps[y][x]));
700     copy_bitmaps[y][x].recycle();
701     copy_bitmaps[y][x] = null;
702     }
703     catch (Exception e)
704     {
705     //e.printStackTrace();
706     }
707     }
708     }
709     }
710     catch (Exception e)
711     {
712     //e.printStackTrace();
713     }
714    
715     try
716     {
717     // try to free the memory of bitmap
718     bitmap_main.recycle();
719     //System.out.println("AAGTL:free_stuff:bitmap_main -> recycle()");
720     bitmap_main = null;
721     }
722     catch (Exception e)
723     {
724     //e.printStackTrace();
725     }
726    
727     System.gc();
728    
729     //System.out.println("AAGTL:free_stuff:002");
730     aagtl.logHeap(this.getClass());
731     }
732    
733 zoffadmin 2 public void clear_stuff()
734     {
735 zoffadmin 4 //System.out.println("AAGTL:clear_stuff:001");
736     aagtl.logHeap(this.getClass());
737    
738     // try
739     // {
740     // for (int dummy = 0; dummy < map_tiles_cache_size; dummy++)
741     // {
742     // try
743     // {
744     // map_tiles_cache[dummy].recycle();
745     // map_tiles_cache[dummy] = null;
746     // }
747     // catch (Exception e)
748     // {
749     // //e.printStackTrace();
750     // }
751     // }
752     // for (int dummy = 0; dummy < map_tiles_parent_cache_size; dummy++)
753     // {
754     // try
755     // {
756     // map_tiles_parent_cache[dummy].recycle();
757     // map_tiles_parent_cache[dummy] = null;
758     // }
759     // catch (Exception e)
760     // {
761     // //e.printStackTrace();
762     // }
763     // }
764     // }
765     // catch (Exception e)
766     // {
767     // //e.printStackTrace();
768     // }
769    
770     //System.gc();
771    
772     //System.out.println("AAGTL:clear_stuff:002");
773     aagtl.logHeap(this.getClass());
774    
775 zoffadmin 2 map_tiles_cache = new Bitmap[map_tiles_cache_size];
776     map_tiles_parent_cache = new Bitmap[map_tiles_parent_cache_size];
777     map_tiles_caches_values = new int[map_tiles_cache_size][2];
778     map_tiles_parent_caches_values = new int[map_tiles_parent_cache_size][2];
779 zoffadmin 4
780     //System.out.println("AAGTL:clear_stuff:003");
781     aagtl.logHeap(this.getClass());
782    
783 zoffadmin 2 for (int dummy = 0; dummy < map_tiles_cache_size; dummy++)
784     {
785     map_tiles_cache[dummy] = null;
786     map_tiles_caches_values[dummy][0] = -1;
787     map_tiles_caches_values[dummy][1] = -1;
788     }
789     for (int dummy = 0; dummy < map_tiles_parent_cache_size; dummy++)
790     {
791     map_tiles_parent_cache[dummy] = null;
792     map_tiles_parent_caches_values[dummy][0] = -1;
793     map_tiles_parent_caches_values[dummy][1] = -1;
794     }
795     }
796    
797     public void clear_stuff_2()
798     {
799 zoffadmin 4 //System.out.println("AAGTL:clear_stuff_2:001");
800     aagtl.logHeap(this.getClass());
801    
802     // try
803     // {
804     // for (int y = 0; y < map_tiles_onscreen.length; y++)
805     // for (int x = 0; x < map_tiles_onscreen[y].length; x++)
806     // {
807     // //System.out.println("AAGTL:clear_stuff_2:" + y + " " + x + " " + String.valueOf(map_tiles_onscreen[y][x]));
808     // map_tiles_onscreen[y][x].recycle();
809     // map_tiles_onscreen[y][x] = null;
810     // }
811     // }
812     // catch (Exception e)
813     // {
814     // //e.printStackTrace();
815     // }
816    
817     // try
818     // {
819     // for (int y = 0; y < map_tiles_onscreen.length; y++)
820     // {
821     // for (int x = 0; x < map_tiles_onscreen[y].length; x++)
822     // {
823     // //System.out.println("AAGTL:clear_stuff_2:" + y + " " + x + " " + String.valueOf(copy_bitmaps[y][x]));
824     // copy_bitmaps[y][x].recycle();
825     // copy_bitmaps[y][x] = null;
826     // }
827     // }
828     // }
829     // catch (Exception e)
830     // {
831     // //e.printStackTrace();
832     // }
833    
834     //System.gc();
835    
836     //System.out.println("AAGTL:clear_stuff_2:002");
837     aagtl.logHeap(this.getClass());
838    
839 zoffadmin 2 map_tiles_onscreen = new Bitmap[num_tiles_x][num_tiles_y];
840     map_tile_filename = new String[num_tiles_x][num_tiles_y];
841     map_tile_num_onscreen = new int[num_tiles_x][num_tiles_y][3];
842    
843     copy_bitmaps = new Bitmap[num_tiles_x][num_tiles_y];
844     copy_tiles = new int[num_tiles_x][num_tiles_y][3];
845    
846 zoffadmin 4 //System.out.println("AAGTL:clear_stuff_2:003");
847     aagtl.logHeap(this.getClass());
848    
849 zoffadmin 2 for (int y = 0; y < map_tiles_onscreen.length; y++)
850     for (int x = 0; x < map_tiles_onscreen[y].length; x++)
851     {
852     // System.out.println("xxxxxxx:" + y + " " + x + " " +
853     // String.valueOf(map_tiles_onscreen[y][x]));
854     map_tiles_onscreen[y][x] = null;
855     }
856    
857     for (int y = 0; y < map_tile_num_onscreen.length; y++)
858     for (int x = 0; x < map_tile_num_onscreen[y].length; x++)
859     {
860     for (int z = 0; z < 2; z++)
861     {
862     map_tile_num_onscreen[y][x][z] = -1;
863     // System.out.println("yyyyyyy:" + y + " " + x + " " + z +
864     // " " + String.valueOf(map_tile_num_onscreen[y][x][z]));
865     }
866     map_tile_num_onscreen[y][x][2] = TILE_NULL;
867     map_tile_filename[y][x] = "";
868     }
869     }
870    
871     public void init_me()
872     {
873     mainpaint = new Paint(0);
874     mainpaint.setAntiAlias(false);
875     mainpaint.setDither(false);
876    
877     rectpaint = new Paint(0);
878     rectpaint.setAntiAlias(false);
879     rectpaint.setDither(false);
880    
881     bitmap_main = Bitmap.createBitmap(9, 9, Bitmap.Config.ARGB_8888);
882     image_main = new Canvas(bitmap_main);
883    
884 zoffadmin 4 this.free_stuff();
885 zoffadmin 2 this.clear_stuff();
886    
887     int width = this.getWidth();
888     int height = this.getHeight();
889     // how many tiles on screen?
890     num_tiles_x = (width / tile_size_x) + 2;
891     num_tiles_y = (height / tile_size_y) + 2;
892    
893     // if modulo 2, then add +1 (this always makes it an odd number!)
894     num_tiles_x = num_tiles_x + Math.abs((num_tiles_x % 2) - 1);
895     num_tiles_y = num_tiles_y + Math.abs((num_tiles_y % 2) - 1);
896    
897     // System.out.println("num t x 1:" + String.valueOf(num_tiles_x));
898     // System.out.println("num t y 1:" + String.valueOf(num_tiles_y));
899    
900     zoom = main_object.global_settings.map_zoom;
901     // System.out.println("rose:zoom3=" + zoom);
902    
903     center_coord = new Coordinate(main_object.global_settings.map_position_lat, main_object.global_settings.map_position_lon);
904     // System.out.println(String.valueOf(main_object.global_settings.map_position_lat));
905     set_center(center_coord);
906     // System.out.println("Center coord x:" + String.valueOf(map_center_x));
907     // System.out.println("Center coord y:" + String.valueOf(map_center_y));
908     __calc_tiles_on_display();
909     }
910    
911     public void zoom_in()
912     {
913     if (this.zoom < 19)
914     {
915     this.set_zoom(this.zoom + 1);
916     }
917     }
918    
919     public void zoom_out()
920     {
921     if (this.zoom > 1)
922     {
923     this.set_zoom(this.zoom - 1);
924     }
925     }
926    
927 zoffadmin 4 public void redraw_like_zoom()
928     {
929     this.set_zoom(this.zoom);
930     }
931    
932 zoffadmin 2 public void set_zoom(int new_zoom)
933     {
934     int temp = new_zoom;
935     this.main_object.gcview.clear_stuff();
936     this.clear_stuff();
937     this.clear_stuff_2();
938     this.main_object.mdl.clear_stuff();
939     this.zoom = temp;
940     main_object.global_settings.map_zoom = this.zoom;
941     this.set_center(new Coordinate(this.main_object.global_settings.map_position_lat, this.main_object.global_settings.map_position_lon));
942     __calc_tiles_on_display();
943     draw_me();
944     this.load_caches_from_db();
945     this.main_object.gcview.invalidate();
946     }
947    
948     public int[] __num2point(int xtile, int ytile)
949     {
950     int[] ret = new int[2];
951     // tiles to pixels on screen
952     // System.out.println("xt:" + xtile + " yt:" + ytile);
953     // System.out.println("mcx:" + map_center_x + " mcy:" + map_center_y);
954     // double d1 = xtile * tile_size_x;
955     // double d2 = map_center_x * tile_size_x;
956     // double d3 = mCanvasWidth / 2;
957     // System.out.println("DDD: " + d1 + " " + d2 + " " + d3);
958     ret[0] = (int) ((xtile * tile_size_x) - (map_center_x * tile_size_x) + (mCanvasWidth / 2));
959     ret[1] = (int) ((ytile * tile_size_y) - (map_center_y * tile_size_y) + (mCanvasHeight / 2));
960     return ret;
961     }
962    
963     synchronized public void draw_me()
964     {
965     // System.out.println(String.valueOf(c.getHeight()));
966     // System.out.println(String.valueOf(c.getWidth()));
967     // c.setDensity(480);
968     // c.setDensity(160);
969    
970     // long a = android.os.SystemClock.elapsedRealtime();
971    
972 zoffadmin 4 try
973 zoffadmin 2 {
974 zoffadmin 4 int[] dummy = new int[2];
975     for (int xtemp = 0; xtemp < num_tiles_x; xtemp++)
976 zoffadmin 2 {
977 zoffadmin 4 for (int ytemp = 0; ytemp < num_tiles_y; ytemp++)
978 zoffadmin 2 {
979 zoffadmin 4 if (map_tile_num_onscreen == null)
980     {
981     return;
982     }
983     if (map_tiles_onscreen == null)
984     {
985     return;
986     }
987 zoffadmin 2
988 zoffadmin 4 // System.out.println("x,y: " + xtemp + " " + ytemp);
989     dummy = __num2point(map_tile_num_onscreen[xtemp][ytemp][0], map_tile_num_onscreen[xtemp][ytemp][1]);
990     // System.out.println("dummy: " + dummy[0] + " " + dummy[1]);
991     // if (false)
992     if (map_tiles_onscreen[xtemp][ytemp] != null)
993     {
994     image_main.drawBitmap(map_tiles_onscreen[xtemp][ytemp], dummy[0] + Rose.larger_offset_x, dummy[1] + Rose.larger_offset_y, mainpaint);
995     }
996     else
997     {
998     rectpaint.setColor(Color.BLACK);
999     rectpaint.setStyle(Paint.Style.FILL);
1000     RectF rectf = new RectF(dummy[0] + Rose.larger_offset_x, dummy[1] + Rose.larger_offset_y, dummy[0] + tile_size_x + Rose.larger_offset_x, dummy[1] + Rose.larger_offset_y + tile_size_y);
1001     image_main.drawRect(rectf, rectpaint);
1002 zoffadmin 2
1003 zoffadmin 4 rectpaint.setColor(Color.RED);
1004     rectpaint.setStyle(Paint.Style.STROKE);
1005     rectf = new RectF(dummy[0] + Rose.larger_offset_x, dummy[1] + Rose.larger_offset_y, dummy[0] + tile_size_x + Rose.larger_offset_x, dummy[1] + tile_size_y + Rose.larger_offset_y);
1006     image_main.drawRect(rectf, rectpaint);
1007     }
1008 zoffadmin 2 }
1009     }
1010     }
1011 zoffadmin 4 catch (Exception e)
1012     {
1013     System.out.println("AAGTL:error 001 in draw_me");
1014     e.printStackTrace();
1015     }
1016 zoffadmin 2
1017     // System.out.println("dm1:" +
1018     // String.valueOf(android.os.SystemClock.elapsedRealtime() - a));
1019     // a = android.os.SystemClock.elapsedRealtime();
1020    
1021     Canvas c = null;
1022     try
1023     {
1024     c = mSurfaceHolder.lockCanvas(null);
1025     synchronized (mSurfaceHolder)
1026     {
1027     // System.out.println(String.valueOf(c));
1028     doDraw(c);
1029     }
1030     }
1031     finally
1032     {
1033     if (c != null)
1034     {
1035     mSurfaceHolder.unlockCanvasAndPost(c);
1036     }
1037     }
1038    
1039     // System.out.println("dm2:" +
1040     // String.valueOf(android.os.SystemClock.elapsedRealtime() - a));
1041    
1042     // ok , reset global redraw notifier
1043     // System.out.println("redraw_notify *OFF* 1");
1044     redraw_notify = false;
1045     }
1046    
1047     /* Callback invoked when the surface dimensions change. */
1048     public void setSurfaceSize(int width, int height)
1049     {
1050     // synchronized to make sure these all change atomically
1051     synchronized (mSurfaceHolder)
1052     {
1053     // System.out.println("x2:" + String.valueOf(width));
1054     // System.out.println("y2:" + String.valueOf(height));
1055    
1056     // mCanvasWidth = width;
1057     // mCanvasHeight = height;
1058     }
1059     }
1060    
1061     public int[] __coord2point(Coordinate c)
1062     {
1063     int[] ret = new int[2];
1064     double[] point = new double[2];
1065    
1066     point = this.deg2num(c);
1067     ret[0] = (int) (point[0] * this.tile_size_x - this.map_center_x * this.tile_size_x + this.mCanvasWidth / 2);
1068     ret[1] = (int) (point[1] * this.tile_size_y - this.map_center_y * this.tile_size_y + this.mCanvasHeight / 2);
1069    
1070     return ret;
1071     }
1072    
1073     public GeocacheCoordinate check_for_cache(int touch_x, int touch_y)
1074     {
1075     GeocacheCoordinate ret = null;
1076     GeocacheCoordinate tmp = null;
1077    
1078     for (int i = 0; i < this.main_object.gcview.caches_loaded.size(); i++)
1079     {
1080     int[] p = new int[2];
1081     try
1082     {
1083     tmp = this.main_object.gcview.caches_loaded.get(i);
1084     // p = this.__coord2point(new Coordinate(tmp.lat, tmp.lon));
1085     p = this.__coord2point((Coordinate) tmp);
1086     if ((Math.abs(p[0] - touch_x) < TOUCH_CACHE_RADIUS) && (Math.abs(p[1] - touch_y) < TOUCH_CACHE_RADIUS))
1087     {
1088     ret = tmp;
1089     return ret;
1090     }
1091     }
1092     catch (IndexOutOfBoundsException e)
1093     {
1094    
1095     }
1096     }
1097    
1098     return ret;
1099     }
1100    
1101     /** Show an event in the LogCat view, for debugging */
1102     private void dumpEvent(MotionEvent event)
1103     {
1104     String names[] = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE", "POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?" };
1105     StringBuilder sb = new StringBuilder();
1106     int action = event.getAction();
1107     int actionCode = action & MotionEvent.ACTION_MASK;
1108     sb.append("event ACTION_").append(names[actionCode]);
1109     if (actionCode == MotionEvent.ACTION_POINTER_DOWN || actionCode == MotionEvent.ACTION_POINTER_UP)
1110     {
1111     sb.append("(pid ").append(action >> MotionEvent.ACTION_POINTER_ID_SHIFT);
1112     sb.append(")");
1113     }
1114     sb.append("[");
1115     for (int i = 0; i < event.getPointerCount(); i++)
1116     {
1117     sb.append("#").append(i);
1118     sb.append("(pid ").append(event.getPointerId(i));
1119     sb.append(")=").append((int) event.getX(i));
1120     sb.append(",").append((int) event.getY(i));
1121     if (i + 1 < event.getPointerCount()) sb.append(";");
1122     }
1123     sb.append("]");
1124     Log.d("dump event", sb.toString());
1125     }
1126    
1127     private float spacing(MotionEvent event)
1128     {
1129     float x = event.getX(0) - event.getX(1);
1130     float y = event.getY(0) - event.getY(1);
1131     return FloatMath.sqrt(x * x + y * y);
1132     }
1133    
1134     private float spacing(PointF a, PointF b)
1135     {
1136     float x = a.x - b.x;
1137     float y = a.y - b.y;
1138     return FloatMath.sqrt(x * x + y * y);
1139     }
1140    
1141     public PointF turn_point(PointF point, double angle)
1142     {
1143     float x = point.x - (this.getWidth() / 2);
1144     float y = point.y - (this.getHeight() / 2);
1145     float x2 = 0;
1146     float y2 = 0;
1147     x2 = (this.getWidth() / 2) + FloatMath.cos((float) Math.toRadians(angle)) * x - FloatMath.sin((float) Math.toRadians(angle)) * y;
1148     y2 = (this.getHeight() / 2) + FloatMath.sin((float) Math.toRadians(angle)) * x + FloatMath.cos((float) Math.toRadians(angle)) * y;
1149     PointF point2 = new PointF(x2, y2);
1150     return point2;
1151     }
1152    
1153     private void midPoint(PointF point, MotionEvent event)
1154     {
1155     float x = event.getX(0) + event.getX(1);
1156     float y = event.getY(0) + event.getY(1);
1157     point.set(x / 2, y / 2);
1158     }
1159    
1160     public boolean onTouch(View view, MotionEvent event)
1161     {
1162     return onTouch_aagtl(view, event);
1163     }
1164    
1165     public boolean onTouch_aagtl(View view, MotionEvent event)
1166     {
1167     String TAG = "onTouch event";
1168    
1169     // dumpEvent(event);
1170    
1171     PointF touch_now2 = null;
1172     PointF touch_start2 = null;
1173     PointF touch_prev2 = null;
1174     PointF touch_last_load_tiles2 = null;
1175    
1176     // touch_now2 = turn_point(this.touch_now,
1177     // this.main_object.cross.get_gps_heading());
1178     // touch_start2 = turn_point(this.touch_start,
1179     // this.main_object.cross.get_gps_heading());
1180     // touch_prev2 = turn_point(this.touch_prev,
1181     // this.main_object.cross.get_gps_heading());
1182     // touch_last_load_tiles2 = turn_point(this.touch_last_load_tiles,
1183     // this.main_object.cross
1184     // .get_gps_heading());
1185    
1186     switch (event.getAction() & MotionEvent.ACTION_MASK)
1187     {
1188     case MotionEvent.ACTION_DOWN:
1189     this.touch_now.set(event.getX(), event.getY());
1190     this.touch_start.set(event.getX(), event.getY());
1191     map_heading_start = this.main_object.cross.get_gps_heading();
1192     this.touch_prev.set(event.getX(), event.getY());
1193     map_heading_prev = this.main_object.cross.get_gps_heading();
1194     this.touch_last_load_tiles.set(event.getX(), event.getY());
1195     map_heading_last_load_tiles = this.main_object.cross.get_gps_heading();
1196     map_center_x_before_move = this.map_center_x;
1197     map_center_y_before_move = this.map_center_y;
1198     touch_mode = DRAG;
1199    
1200     // Log.d(TAG, "touch_mode=(START!!)");
1201     // Log.d(TAG, "start=" + this.touch_start.x + "," +
1202     // this.touch_start.y);
1203     // Log.d(TAG, "prev=" + this.touch_prev.x + "," +
1204     // this.touch_prev.y);
1205     // Log.d(TAG, "now=" + this.touch_now.x + "," + this.touch_now.y);
1206    
1207     break;
1208     case MotionEvent.ACTION_UP:
1209     case MotionEvent.ACTION_POINTER_UP:
1210     this.touch_now.set(event.getX(), event.getY());
1211     if (this.main_object.global_settings.options_turn_map_on_heading)
1212     {
1213     touch_now2 = turn_point(this.touch_now, this.main_object.cross.get_gps_heading());
1214     touch_start2 = turn_point(this.touch_start, map_heading_start);
1215     }
1216     else
1217     {
1218     touch_now2 = touch_now;
1219     touch_start2 = touch_start;
1220     }
1221     // Log.d(TAG, "hd1=" + this.main_object.cross.get_gps_heading());
1222     // Log.d(TAG, "hd2=" + map_heading_start);
1223    
1224     // Log.d(TAG, "spacing from start=" + spacing(touch_start2,
1225     // touch_now2));
1226    
1227     if ((touch_mode == DRAG) && (spacing(touch_start2, touch_now2) < 8f))
1228     {
1229     // just a single press down
1230     touch_mode = PRESS;
1231    
1232     // check if OSD-button was touched
1233     if (this.main_object.follow_button_rect.contains(touch_start2.x, touch_start2.y))
1234     {
1235     // toggle follow mode
1236     if (this.main_object.follow_mode)
1237     {
1238     this.main_object.turn_off_follow_mode();
1239     this.main_object.cross.invalidate();
1240     }
1241     else
1242     {
1243     this.main_object.turn_on_follow_mode();
1244     this.main_object.cross.invalidate();
1245     }
1246     }
1247     else if (this.main_object.arrow_button_rect.contains(touch_start2.x, touch_start2.y))
1248     {
1249     // arrow OSD button pressed
1250     this.main_object.set_display_screen(aagtl.DISPLAY_VIEW_ARROW);
1251     return true;
1252     }
1253 zoffadmin 4 else if ((!this.main_object.has_hw_menu_button) && (this.main_object.menu_button_rect_touch.contains(touch_start2.x, touch_start2.y)))
1254     {
1255     // open the options menu
1256     main_object.openOptionsMenu_wrapper();
1257     }
1258 zoffadmin 2 // check if a cache was touched
1259     else if (this.main_object.gcview.caches_loaded != null)
1260     {
1261     // only allow to touch caches if a certain zoom level is reached
1262     if (this.zoom >= aagtl.TOUCH_CACHES_AFTER_THIS_ZOOM_LEVEL)
1263     {
1264 zoffadmin 4 //System.out.println("XXXXXXXX zoom=" + this.zoom);
1265 zoffadmin 2 if (this.main_object.gcview.caches_loaded.size() <= this.main_object.gcview.MAX_DRAW_POINTS)
1266     {
1267     GeocacheCoordinate cache_touched = this.check_for_cache((int) touch_start2.x, (int) touch_start2.y);
1268     if (cache_touched != null)
1269     {
1270     this.main_object.cacheview.set_cache(cache_touched);
1271     this.main_object.set_display_screen(aagtl.DISPLAY_VIEW_GC);
1272     return true;
1273     }
1274     }
1275     }
1276     }
1277    
1278     if (redraw_notify)
1279     {
1280     // System.out.println("redraw_notify 1");
1281     // __calc_tiles_on_display();
1282     draw_me();
1283     }
1284     // check if a cache was touched
1285    
1286     // Log.d(TAG, "touch_mode=PRESS");
1287     // Log.d(TAG, "start=" + touch_start.x + "," + touch_start.y);
1288     // Log.d(TAG, "start2=" + touch_start2.x + "," +
1289     // touch_start2.y);
1290     // Log.d(TAG, "prev=" +touch_prev.x + "," + touch_prev.y);
1291     // Log.d(TAG, "now=" + touch_now.x + "," + touch_now.y);
1292     // Log.d(TAG, "now2=" + touch_now2.x + "," + touch_now2.y);
1293     touch_mode = NONE;
1294     }
1295     else
1296     {
1297     if (touch_mode == DRAG)
1298     {
1299     if (this.main_object.global_settings.options_turn_map_on_heading)
1300     {
1301     touch_now2 = turn_point(this.touch_now, this.main_object.cross.get_gps_heading());
1302     touch_start2 = turn_point(this.touch_start, map_heading_start);
1303     }
1304     else
1305     {
1306     touch_now2 = touch_now;
1307     touch_start2 = touch_start;
1308     }
1309    
1310     // end of "drag" move
1311     // Log.d(TAG, "spacing from start=" +
1312     // spacing(this.touch_start, this.touch_now));
1313    
1314     // ------------ OLD routine --------------
1315     // ------------ OLD routine --------------
1316     // ------------ OLD routine --------------
1317     // PointF now_turned = turn_point(this.touch_now,
1318     // this.main_object.cross
1319     // .get_gps_heading());
1320     // PointF start_turned = turn_point(this.touch_start,
1321     // this.main_object.cross
1322     // .get_gps_heading());
1323     double map_center_x_t = map_center_x_before_move - ((float) (touch_now2.x - touch_start2.x) / (float) tile_size_x);
1324     double map_center_y_t = map_center_y_before_move - ((float) (touch_now2.y - touch_start2.y) / (float) tile_size_y);
1325     Coordinate temp_c = this.num2deg(map_center_x_t, map_center_y_t);
1326     set_center(temp_c);
1327     __calc_tiles_on_display();
1328     draw_me();
1329     // draw caches
1330     // this.main_object.gcview.invalidate();
1331     // load caches fresh from DB
1332     this.load_caches_from_db();
1333    
1334     this.main_object.change_status_text(String.format("lat %.5f", temp_c.lat) + " " + String.format("lon %.5f", temp_c.lon));
1335     // this.main_object.status_text.append(" " +
1336     // String.format("%.3f", this.map_center_x) + " "
1337     // + String.format("%.3f", this.map_center_y));
1338     // ------------ OLD routine --------------
1339     // ------------ OLD routine --------------
1340     // ------------ OLD routine --------------
1341    
1342     // Log.d(TAG, "touch_mode=NONE (END of DRAG) (" +
1343     // (event.getX() - this.touch_prev.x)
1344     // + "," + (event.getY() - this.touch_prev.y) + ")");
1345     // Log.d(TAG, "touch_mode=NONE (END of DRAG) ("
1346     // + (event.getX() - this.touch_start.x) + ","
1347     // + (event.getY() - this.touch_start.y) + ")");
1348    
1349     // Log.d(TAG, "start=" + this.touch_start.x + "," +
1350     // this.touch_start.y);
1351     // Log.d(TAG, "prev=" + this.touch_prev.x + "," +
1352     // this.touch_prev.y);
1353     // Log.d(TAG, "now=" + this.touch_now.x + "," +
1354     // this.touch_now.y);
1355     touch_mode = NONE;
1356     }
1357     else
1358     {
1359     if (touch_mode == ZOOM)
1360     {
1361     // end of "pinch zoom" move
1362     float newDist = spacing(event);
1363     float scale = 0;
1364     if (newDist > 10f)
1365     {
1366     scale = newDist / oldDist;
1367     }
1368    
1369     if (scale > 1.3)
1370     {
1371     // zoom in
1372     this.zoom_in();
1373     }
1374     else if (scale < 0.8)
1375     {
1376     // zoom out
1377     this.zoom_out();
1378     }
1379    
1380     // Log.d(TAG, "touch_mode=NONE (END of ZOOM part 1) (" +
1381     // scale + ")");
1382     // Log.d(TAG, "start=" + this.touch_start.x + "," +
1383     // this.touch_start.y);
1384     // Log.d(TAG, "prev=" + this.touch_prev.x + "," +
1385     // this.touch_prev.y);
1386     // Log.d(TAG, "now=" + this.touch_now.x + "," +
1387     // this.touch_now.y);
1388     touch_mode = NONE;
1389     }
1390     else
1391     {
1392     // Log.d(TAG, "touch_mode=NONE (END of ZOOM part 2)");
1393     touch_mode = NONE;
1394     }
1395     }
1396     }
1397     break;
1398     case MotionEvent.ACTION_MOVE:
1399     if (touch_mode == DRAG)
1400     {
1401     this.touch_now.set(event.getX(), event.getY());
1402     if (this.main_object.global_settings.options_turn_map_on_heading)
1403     {
1404     touch_now2 = turn_point(this.touch_now, this.main_object.cross.get_gps_heading());
1405     touch_start2 = turn_point(this.touch_start, map_heading_start);
1406     touch_prev2 = turn_point(this.touch_prev, map_heading_prev);
1407     touch_last_load_tiles2 = turn_point(this.touch_last_load_tiles, map_heading_last_load_tiles);
1408     }
1409     else
1410     {
1411     touch_now2 = touch_now;
1412     touch_start2 = touch_start;
1413     touch_prev2 = touch_prev;
1414     touch_last_load_tiles2 = touch_last_load_tiles;
1415     }
1416    
1417     // Log.d(TAG, "spacing from start=" + spacing(touch_start2,
1418     // touch_now2));
1419    
1420     if ((Math.abs(touch_now2.x - touch_last_load_tiles2.x) < tile_size_x * 0.4) && (Math.abs(touch_now2.y - touch_last_load_tiles2.y) < tile_size_y * 0.4))
1421     {
1422     // only small move -> smear image
1423     // System.out.println("DRAG -> near");
1424    
1425     // ------------ OLD routine ------------
1426     // ------------ OLD routine ------------
1427     // ------------ OLD routine ------------
1428     // System.out.println("Ms d:" + deltax + " " + deltay +
1429     // " p:" + prev_x + " " + prev_y + "mc:"
1430     // + map_center_x + " " + map_center_y + " C" + X + " " +
1431     // Y);
1432    
1433     double tempxxx = ((float) (touch_now2.x - touch_prev2.x) / (float) tile_size_x);
1434     double tempyyy = ((float) (touch_now2.y - touch_prev2.y) / (float) tile_size_y);
1435     // System.out.println("tx:" + tempxxx + " ty:" + tempyyy);
1436     double map_center_x_t8 = map_center_x - tempxxx;
1437     double map_center_y_t8 = map_center_y - tempyyy;
1438     // System.out.println("tx:" + tile_size_x + " ty:" +
1439     // tile_size_y);
1440     // System.out.println("mxn:" + map_center_x_t8 + " myn:" +
1441     // map_center_y_t8);
1442     Coordinate temp_c8 = this.num2deg(map_center_x_t8, map_center_y_t8);
1443     set_center(temp_c8);
1444    
1445     Canvas c = null;
1446     try
1447     {
1448     c = mSurfaceHolder.lockCanvas(null);
1449     synchronized (mSurfaceHolder)
1450     {
1451     if ((c != null) && (bitmap_main != null))
1452     {
1453     if (this.main_object.global_settings.options_turn_map_on_heading)
1454     {
1455     c.rotate((int) -this.main_object.cross.get_gps_heading(), this.getWidth() / 2, this.getHeight() / 2);
1456     }
1457     c.drawBitmap(bitmap_main, touch_now2.x - touch_last_load_tiles2.x - larger_offset_x, touch_now2.y - touch_last_load_tiles2.y - larger_offset_y, null);
1458     // draw caches
1459     // System.out.println("iigc2");
1460     this.main_object.gcview.invalidate();
1461     }
1462     }
1463     }
1464     finally
1465     {
1466     if (c != null)
1467     {
1468     mSurfaceHolder.unlockCanvasAndPost(c);
1469     }
1470     }
1471     this.main_object.change_status_text(String.format("lat %.5f", temp_c8.lat) + " " + String.format("lon %.5f", temp_c8.lon));
1472     // this.main_object.status_text.append(" " +
1473     // String.format("%.3f", this.map_center_x) + " "
1474     // + String.format("%.3f", this.map_center_y));
1475     // ------------ OLD routine ------------
1476     // ------------ OLD routine ------------
1477     // ------------ OLD routine ------------
1478     }
1479     else
1480     {
1481     // bigger move -> load tiles new, draw new
1482     // System.out.println("DRAG -> far");
1483    
1484     // ------------ OLD routine ------------
1485     // ------------ OLD routine ------------
1486     // ------------ OLD routine ------------
1487    
1488     // System.out.println("Mb d:" + deltax + " " + deltay +
1489     // " p:" + prev_x + " " + prev_y + "mc:"
1490     // + map_center_x + " " + map_center_y + " C" + X + " " +
1491     // Y);
1492     if (this.main_object.global_settings.options_turn_map_on_heading)
1493     {
1494     touch_now2 = turn_point(this.touch_now, this.main_object.cross.get_gps_heading());
1495     touch_start2 = turn_point(this.touch_start, map_heading_start);
1496     touch_prev2 = turn_point(this.touch_prev, map_heading_prev);
1497     touch_last_load_tiles2 = turn_point(this.touch_last_load_tiles, map_heading_last_load_tiles);
1498     }
1499     else
1500     {
1501     touch_now2 = touch_now;
1502     touch_start2 = touch_start;
1503     touch_prev2 = touch_prev;
1504     touch_last_load_tiles2 = touch_last_load_tiles;
1505     }
1506    
1507     double tempxxx = ((float) (touch_now2.x - touch_prev2.x) / (float) tile_size_x);
1508     double tempyyy = ((float) (touch_now2.y - touch_prev2.y) / (float) tile_size_y);
1509     // System.out.println("tx:" + tempxxx + " ty:" + tempyyy);
1510     double map_center_x_t8 = map_center_x - tempxxx;
1511     double map_center_y_t8 = map_center_y - tempyyy;
1512     // System.out.println("tx:" + tile_size_x + " ty:" +
1513     // tile_size_y);
1514     // System.out.println("mxn:" + map_center_x_t8 + " myn:" +
1515     // map_center_y_t8);
1516     Coordinate temp_c8 = this.num2deg(map_center_x_t8, map_center_y_t8);
1517     set_center(temp_c8);
1518    
1519     // double map_center_x_t22 = map_center_x
1520     // - ((float) (this.touch_now.x - this.touch_prev.x) /
1521     // (float) tile_size_x);
1522     // double map_center_y_t22 = map_center_y
1523     // - ((float) (this.touch_now.x - this.touch_prev.y) /
1524     // (float) tile_size_y);
1525     // Coordinate temp_c22 = this.num2deg(map_center_x_t22,
1526     // map_center_y_t22);
1527     // set_center(temp_c22);
1528    
1529     __calc_tiles_on_display();
1530     draw_me();
1531     // draw caches
1532     // this.main_object.gcview.invalidate();
1533     // load caches fresh from DB
1534     this.load_caches_from_db();
1535    
1536     this.main_object.change_status_text(String.format("lat %.5f", temp_c8.lat) + " " + String.format("lon %.5f", temp_c8.lon));
1537     // this.main_object.status_text.append(" " +
1538     // String.format("%.3f", this.map_center_x) + " "
1539     // + String.format("%.3f", this.map_center_y));
1540    
1541     // ------------ OLD routine ------------
1542     // ------------ OLD routine ------------
1543     // ------------ OLD routine ------------
1544    
1545     // set "last load tiles" point
1546     this.touch_last_load_tiles.set(this.touch_now.x, this.touch_now.y);
1547     map_heading_last_load_tiles = this.main_object.cross.get_gps_heading();
1548     }
1549    
1550     this.touch_prev.set(event.getX(), event.getY());
1551     map_heading_prev = this.main_object.cross.get_gps_heading();
1552     }
1553     else if (touch_mode == ZOOM)
1554     {
1555     this.touch_now.set(event.getX(), event.getY());
1556     // float newDist = spacing(event);
1557     // Log.d(TAG, "newDist=" + newDist);
1558     // if (newDist > 10f)
1559     // {
1560     // matrix.set(savedMatrix);
1561     // float scale = newDist / oldDist;
1562    
1563     // Log.d(TAG, "touch_mode=ZOOM (" + scale + ")");
1564     // Log.d(TAG, "start=" + this.touch_start.x + "," +
1565     // this.touch_start.y);
1566     // Log.d(TAG, "prev=" + this.touch_prev.x + "," +
1567     // this.touch_prev.y);
1568     // Log.d(TAG, "now=" + this.touch_now.x + "," +
1569     // this.touch_now.y);
1570     // matrix.postScale(scale, scale, mid.x, mid.y);
1571     // }
1572    
1573     this.touch_prev.set(event.getX(), event.getY());
1574     map_heading_prev = this.main_object.cross.get_gps_heading();
1575     }
1576     break;
1577     case MotionEvent.ACTION_POINTER_DOWN:
1578     oldDist = spacing(event);
1579     // Log.d(TAG, "oldDist=" + oldDist);
1580     if (oldDist > 10f)
1581     {
1582     // savedMatrix.set(matrix);
1583     // midPoint(mid, event);
1584     touch_mode = ZOOM;
1585    
1586     // Log.d(TAG, "touch_mode=ZOOM");
1587     // Log.d(TAG, "start=" + this.touch_start.x + "," +
1588     // this.touch_start.y);
1589     // Log.d(TAG, "prev=" + this.touch_prev.x + "," +
1590     // this.touch_prev.y);
1591     // Log.d(TAG, "now=" + this.touch_now.x + "," +
1592     // this.touch_now.y);
1593     }
1594     break;
1595     }
1596     return true;
1597     }
1598    
1599     public void load_caches_from_db()
1600     {
1601     List<GeocacheCoordinate> caches_read = new ArrayList<GeocacheCoordinate>();
1602     try
1603     {
1604     caches_read = this.main_object.pv.get_points_filter(this.main_object.get_visible_area_large(), this.main_object.global_settings.options_hide_found, 50);
1605     }
1606     catch (Exception e)
1607     {
1608 zoffadmin 4 //e.printStackTrace();
1609 zoffadmin 2 }
1610     this.main_object.gcview.set_loaded_caches(caches_read);
1611     }
1612    
1613     public void draw_view()
1614     {
1615     Canvas c = null;
1616     try
1617     {
1618     c = mSurfaceHolder.lockCanvas(null);
1619     synchronized (mSurfaceHolder)
1620     {
1621     if ((c != null) && (bitmap_main != null))
1622     {
1623     this.doDraw(c);
1624     }
1625     }
1626     }
1627     finally
1628     {
1629     if (c != null)
1630     {
1631     mSurfaceHolder.unlockCanvasAndPost(c);
1632     }
1633     }
1634     }
1635    
1636     private void doDraw(Canvas canvas)
1637     {
1638     // System.out.println("Rose: doDraw");
1639     if ((canvas != null) && (bitmap_main != null))
1640     {
1641     // System.out.println("mcx:" + map_center_x);
1642     // System.out.println("mcy:" + map_center_y);
1643     if (this.main_object.global_settings.options_turn_map_on_heading)
1644     {
1645     canvas.rotate((int) -this.main_object.cross.get_gps_heading(), this.getWidth() / 2, this.getHeight() / 2);
1646     }
1647 zoffadmin 4 try
1648     {
1649     canvas.drawBitmap(bitmap_main, -Rose.larger_offset_x, -Rose.larger_offset_y, null);
1650     }
1651     catch (Exception e)
1652     {
1653     //e.printStackTrace();
1654     }
1655 zoffadmin 2 }
1656     }
1657    
1658     public Rose(Context context, aagtl m)
1659     {
1660     super(context);
1661    
1662     // register our interest in hearing about changes to our surface
1663     SurfaceHolder holder = getHolder();
1664     mSurfaceHolder = holder;
1665     main_object = m;
1666     holder.addCallback(this);
1667    
1668     init_me();
1669    
1670     // System.out.println("x " + String.valueOf(this.getWidth()));
1671     // System.out.println("y " + String.valueOf(this.getHeight()));
1672    
1673     setFocusable(true); // make sure we get key events
1674     this.setOnTouchListener(this); // get touchscreen events
1675     }
1676    
1677     @Override
1678     public void onWindowFocusChanged(boolean hasWindowFocus)
1679     {
1680     // System.out.println("rose:zoom2=" + zoom);
1681     }
1682    
1683     /* Callback invoked when the surface dimensions change. */
1684     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
1685     {
1686     // System.out.println("surfaceChanged:" + String.valueOf(width));
1687     // System.out.println("surfaceChanged:" + String.valueOf(height));
1688 zoffadmin 4 //System.out.println("AAGTL:surfaceChanged:");
1689 zoffadmin 2
1690     this.mCanvasWidth = width;
1691     this.mCanvasHeight = height;
1692    
1693 zoffadmin 4 //System.out.println("AAGTL:surfaceChanged:001");
1694     aagtl.logHeap(this.getClass());
1695    
1696 zoffadmin 2 // -----------------------------------------
1697     // -----------------------------------------
1698     // OSD button positions
1699     this.main_object.follow_button_rect = new RectF(10, this.mCanvasHeight - this.main_object.follow_current.getHeight() - 10, 10 + this.main_object.follow_current.getWidth(), this.mCanvasHeight - 10);
1700    
1701     this.main_object.arrow_button_rect = new RectF(this.mCanvasWidth - 10 - this.main_object.arrow_button.getWidth(), this.mCanvasHeight - this.main_object.arrow_button.getHeight() - 10, this.mCanvasWidth - 10, this.mCanvasHeight - 10);
1702 zoffadmin 4
1703     if (aagtl.Global_real_dpi >= 320)
1704     {
1705     this.main_object.menu_button_rect = new RectF(this.mCanvasWidth - 10 - this.main_object.menu_button.getWidth(), 10, this.mCanvasWidth - 10, this.main_object.menu_button.getHeight() + 10);
1706     this.main_object.menu_button_rect_touch = new RectF(this.mCanvasWidth - 10 - this.main_object.menu_button.getWidth(), 10, this.mCanvasWidth - 10, this.main_object.menu_button.getHeight() + 10);
1707     }
1708     else
1709     {
1710     final int addon_left = 50;
1711     final int addon_down = 40;
1712     this.main_object.menu_button_rect = new RectF(this.mCanvasWidth - 10 - this.main_object.menu_button.getWidth(), 10, this.mCanvasWidth - 10, this.main_object.menu_button.getHeight() + 10);
1713     this.main_object.menu_button_rect_touch = new RectF(this.mCanvasWidth - 10 - this.main_object.menu_button.getWidth() - addon_left, 10, this.mCanvasWidth - 10, this.main_object.menu_button.getHeight() + 10 + addon_down);
1714     }
1715    
1716 zoffadmin 2 // OSD button positions
1717     // -----------------------------------------
1718     // -----------------------------------------
1719    
1720     if (bitmap_main != null)
1721     {
1722     // try to free the memory of bitmap
1723     bitmap_main.recycle();
1724 zoffadmin 4 //System.out.println("AAGTL:bitmap_main -> recycle()");
1725     bitmap_main = null;
1726     //System.gc();
1727 zoffadmin 2 }
1728     bitmap_main = Bitmap.createBitmap((this.getWidth() + Rose.larger_offset_x * 2), (this.getHeight() + Rose.larger_offset_x * 2), Bitmap.Config.ARGB_8888);
1729     image_main = new Canvas(bitmap_main);
1730    
1731 zoffadmin 4 // DPI
1732     //image_main.setDensity(aagtl.Global_want_dpi);
1733    
1734     // DPI
1735     tile_size_x = (int) ((float) tile_size_x_real_ * ((float) aagtl.Global_real_dpi / (float) aagtl.Global_want_dpi));
1736     tile_size_y = (int) ((float) tile_size_y_real_ * ((float) aagtl.Global_real_dpi / (float) aagtl.Global_want_dpi));
1737    
1738 zoffadmin 2 // how many tiles on screen?
1739     num_tiles_x = (width / tile_size_x) + 2 + more_for_speed_x;
1740     num_tiles_y = (height / tile_size_y) + 2 + more_for_speed_y;
1741    
1742     // if modulo 2, then add +1 (this always makes it an odd number!)
1743     num_tiles_x = num_tiles_x + Math.abs((num_tiles_x % 2) - 1);
1744     num_tiles_y = num_tiles_y + Math.abs((num_tiles_y % 2) - 1);
1745    
1746     // System.out.println("num t x:" + String.valueOf(num_tiles_x));
1747     // System.out.println("num t y:" + String.valueOf(num_tiles_y));
1748    
1749 zoffadmin 4 //System.out.println("AAGTL:surfaceChanged:002");
1750     aagtl.logHeap(this.getClass());
1751    
1752 zoffadmin 2 this.clear_stuff_2();
1753    
1754     for (int xtemp = 1; xtemp < num_tiles_x + 1; xtemp++)
1755     {
1756     xit.add(new Integer(xtemp));
1757     }
1758    
1759     for (int ytemp = 1; ytemp < num_tiles_y + 1; ytemp++)
1760     {
1761     yit.add(new Integer(ytemp));
1762     }
1763    
1764     // zoom = main_object.global_settings.map_zoom;
1765     //
1766     // System.out.println("rose:zoom1=" + zoom);
1767     //
1768     // center_coord = new
1769     // Coordinate(main_object.global_settings.map_position_lat,
1770     // main_object.global_settings.map_position_lon);
1771     // set_center(center_coord);
1772    
1773     __calc_tiles_on_display();
1774     draw_me();
1775     this.load_caches_from_db();
1776     // System.out.println("iigc4");
1777     this.main_object.gcview.invalidate();
1778     }
1779    
1780     /*
1781     * Callback invoked when the Surface has been created and is ready to be
1782     * used.
1783     */
1784     public void surfaceCreated(SurfaceHolder holder)
1785     {
1786     // start the thread here so that we don't busy-wait in run()
1787     // waiting for the surface to be created
1788     // System.out.println("Rose: surfaceCreated");
1789     }
1790    
1791     /*
1792     * Callback invoked when the Surface has been destroyed and must no longer
1793     * be touched. WARNING: after this method returns, the Surface/Canvas must
1794     * never be touched again!
1795     */
1796     public void surfaceDestroyed(SurfaceHolder holder)
1797     {
1798     // we have to tell thread to shut down & wait for it to finish, or else
1799     // it might touch the Surface after we return and explode
1800     }
1801    
1802     }

   
Visit the aagtl Website