1+ package space .itoncek .trailcompass .app .hideandseek .hider_ui ;
2+
3+ import static android .view .View .GONE ;
4+ import static android .view .View .VISIBLE ;
5+
6+ import static space .itoncek .trailcompass .app .utils .RunnableUtils .runOnBackgroundThread ;
7+
8+ import android .content .Intent ;
9+ import android .os .Bundle ;
10+ import android .util .Log ;
11+ import android .widget .TextView ;
12+
13+ import androidx .activity .EdgeToEdge ;
14+ import androidx .appcompat .app .AppCompatActivity ;
15+ import androidx .core .graphics .Insets ;
16+ import androidx .core .view .ViewCompat ;
17+ import androidx .core .view .WindowInsetsCompat ;
18+
19+ import org .mapsforge .core .util .Parameters ;
20+ import org .mapsforge .map .android .graphics .AndroidGraphicFactory ;
21+ import org .mapsforge .map .android .util .AndroidUtil ;
22+ import org .mapsforge .map .datastore .MapDataStore ;
23+ import org .mapsforge .map .layer .cache .TileCache ;
24+ import org .mapsforge .map .layer .renderer .TileRendererLayer ;
25+ import org .mapsforge .map .reader .MapFile ;
26+ import org .mapsforge .map .rendertheme .internal .MapsforgeThemes ;
27+
28+ import java .io .File ;
29+ import java .io .IOException ;
30+ import java .util .concurrent .CountDownLatch ;
31+ import java .util .concurrent .atomic .AtomicBoolean ;
32+
33+ import space .itoncek .trailcompass .app .R ;
34+ import space .itoncek .trailcompass .app .hideandseek .api .HideAndSeekAPIFactory ;
35+ import space .itoncek .trailcompass .app .hideandseek .seeker_ui .SeekerMapView ;
36+ import space .itoncek .trailcompass .client .api .HideAndSeekAPI ;
37+
38+ public class HiderMapView extends AppCompatActivity {
39+ private HideAndSeekAPI api ;
40+ private org .mapsforge .map .android .view .MapView mapView ;
41+ File mapfile ;
42+
43+ @ Override
44+ protected void onCreate (Bundle savedInstanceState ) {
45+ super .onCreate (savedInstanceState );
46+ EdgeToEdge .enable (this );
47+ setContentView (R .layout .activity_hide_mapview );
48+ ViewCompat .setOnApplyWindowInsetsListener (findViewById (R .id .main ), (v , insets ) -> {
49+ Insets systemBars = insets .getInsets (WindowInsetsCompat .Type .systemBars ());
50+ v .setPadding (systemBars .left , systemBars .top , systemBars .right , systemBars .bottom );
51+ return insets ;
52+ });
53+ AndroidGraphicFactory .createInstance (getApplication ());
54+
55+ mapfile = new File (getCacheDir () + "/map.map" );
56+ mapView = findViewById (R .id .map_mapview );
57+ api = new HideAndSeekAPIFactory (getFilesDir ()).generateHideAndSeekAPI ();
58+
59+ if (amIHider ()) {
60+ showAdminView ();
61+ setUsername ();
62+ setupTimer ();
63+ setupButtons ();
64+ openMap ();
65+ } else {
66+ Intent i = new Intent (this , SeekerMapView .class );
67+ startActivity (i );
68+ finish ();
69+ }
70+ }
71+
72+ private boolean amIHider () {
73+ AtomicBoolean result = new AtomicBoolean (false );
74+ CountDownLatch cdl = new CountDownLatch (1 );
75+ runOnBackgroundThread (()-> {
76+ try {
77+ result .set (api .amIHider ());
78+ cdl .countDown ();
79+ } catch (IOException e ) {
80+ Log .e (HiderMapView .class .getName (),"Unable to determine if I'm a hider or not" ,e );
81+ }
82+ });
83+ try {
84+ cdl .await ();
85+ } catch (InterruptedException e ) {
86+ throw new RuntimeException (e );
87+ }
88+ return result .get ();
89+ }
90+
91+ private void setupButtons () {
92+ findViewById (R .id .map_resetButton ).setOnClickListener ((c )-> {
93+ setUsername ();
94+ showAdminView ();
95+ setupTimer ();
96+ });
97+ }
98+
99+ // TODO)) Create timer handler!
100+ private void setupTimer () {
101+
102+ }
103+
104+ private void setUsername () {
105+ Thread t = new Thread (()-> {
106+ try {
107+ String name = api .myName ();
108+ runOnUiThread (()-> ((TextView )findViewById (R .id .map_username )).setText (name ));
109+ } catch (IOException e ) {
110+ Log .e (HiderMapView .class .getName (), "Unable to contact the main server" , e );
111+ }
112+ });
113+ t .start ();
114+ }
115+
116+ private void showAdminView () {
117+ Thread t = new Thread (()-> {
118+ try {
119+ if (api .amIAdmin ()) {
120+ runOnUiThread (()->findViewById (R .id .map_switchToSettings ).setVisibility (VISIBLE ));
121+ } else {
122+ runOnUiThread (()->findViewById (R .id .map_switchToSettings ).setVisibility (GONE ));
123+ }
124+ } catch (IOException e ) {
125+ Log .e (HiderMapView .class .getName (), "Unable to contact the main server" , e );
126+ }
127+ });
128+ t .start ();
129+ }
130+
131+ private void openMap () {
132+ mapView .setClickable (true );
133+ mapView .getMapScaleBar ().setVisible (true );
134+ mapView .setBuiltInZoomControls (true );
135+
136+ Parameters .NUMBER_OF_THREADS = 8 ;
137+ Parameters .ANTI_ALIASING = true ;
138+ Parameters .PARENT_TILES_RENDERING = Parameters .ParentTilesRendering .SPEED ;
139+
140+ TileCache tileCache = AndroidUtil .createTileCache (this , "mapcache" ,
141+ mapView .getModel ().displayModel .getTileSize (), 1f ,
142+ mapView .getModel ().frameBufferModel .getOverdrawFactor ());
143+
144+ MapDataStore mapDataStore = new MapFile (mapfile );
145+ TileRendererLayer tileRendererLayer = new TileRendererLayer (tileCache , mapDataStore ,
146+ mapView .getModel ().mapViewPosition , AndroidGraphicFactory .INSTANCE );
147+ tileRendererLayer .setCacheTileMargin (1 );
148+ tileRendererLayer .setCacheZoomMinus (1 );
149+ tileRendererLayer .setCacheZoomPlus (2 );
150+ tileRendererLayer .setXmlRenderTheme (MapsforgeThemes .OSMARENDER );
151+
152+ mapView .getLayerManager ().getLayers ().add (tileRendererLayer );
153+
154+ mapView .setCenter (mapDataStore .startPosition ());
155+ mapView .setZoomLevel (mapDataStore .startZoomLevel ());
156+ }
157+ }
0 commit comments