99import android .os .AsyncTask ;
1010import android .os .Build ;
1111import android .os .Bundle ;
12+ import android .preference .PreferenceFragment ;
1213import android .preference .PreferenceManager ;
1314import android .provider .MediaStore ;
14- import android .support .v7 .app .ActionBarActivity ;
15+ import android .support .v7 .app .AppCompatActivity ;
1516import android .support .v7 .widget .PopupMenu ;
17+ import android .util .Log ;
1618import android .view .Menu ;
1719import android .view .MenuItem ;
1820import android .view .View ;
1921import android .view .WindowManager ;
22+ import android .widget .ImageView ;
2023import android .widget .Toast ;
2124
22- public class CanvasActivity extends ActionBarActivity implements View .OnSystemUiVisibilityChangeListener {
23- private static int RESULT_LOAD_IMAGE = 1 ;
25+ public class CanvasActivity extends AppCompatActivity implements View .OnSystemUiVisibilityChangeListener , SharedPreferences .OnSharedPreferenceChangeListener {
26+ private static final int RESULT_LOAD_IMAGE = 1 ;
27+ private static final String TAG = "GfxTablet.Canvas" ;
28+
29+ final Uri homepageUri = Uri .parse (("https://rfc2822.github.io/GfxTablet/" ));
2430
2531 NetworkClient netClient ;
26- CanvasView canvas ;
2732
2833 SharedPreferences preferences ;
2934 boolean fullScreen = false ;
@@ -34,18 +39,18 @@ protected void onCreate(Bundle savedInstanceState) {
3439 super .onCreate (savedInstanceState );
3540
3641 preferences = PreferenceManager .getDefaultSharedPreferences (this );
42+ preferences .registerOnSharedPreferenceChangeListener (this );
43+
44+ setContentView (R .layout .activity_canvas );
3745
46+ // create network client in a separate thread
3847 netClient = new NetworkClient (PreferenceManager .getDefaultSharedPreferences (this ));
3948 new Thread (netClient ).start ();
40-
41- canvas = new CanvasView (CanvasActivity .this , netClient );
42- }
43-
44- @ Override
45- protected void onStart () {
46- super .onStart ();
47-
4849 new ConfigureNetworkingTask ().execute ();
50+
51+ // notify CanvasView of the network client
52+ CanvasView canvas = (CanvasView )findViewById (R .id .canvas );
53+ canvas .setNetworkClient (netClient );
4954 }
5055
5156 @ Override
@@ -61,9 +66,9 @@ protected void onResume() {
6166 }
6267
6368 @ Override
64- protected void onStop () {
69+ protected void onDestroy () {
70+ super .onDestroy ();
6571 netClient .getQueue ().add (new NetEvent (NetEvent .Type .TYPE_DISCONNECT ));
66- super .onStop ();
6772 }
6873
6974 @ Override
@@ -81,14 +86,33 @@ public void onBackPressed() {
8186 }
8287
8388 public void showAbout (MenuItem item ) {
84- startActivity (new Intent (Intent .ACTION_VIEW , Uri .parse (("https://rfc2822.github.io/GfxTablet/" ))));
89+ startActivity (new Intent (Intent .ACTION_VIEW , homepageUri ));
90+ }
91+
92+ public void showDonate (MenuItem item ) {
93+ startActivity (new Intent (Intent .ACTION_VIEW , homepageUri .buildUpon ().fragment ("donate" ).build ()));
8594 }
8695
8796 public void showSettings (MenuItem item ) {
8897 startActivityForResult (new Intent (this , SettingsActivity .class ), 0 );
8998 }
9099
91100
101+ // preferences were changed
102+
103+ @ Override
104+ public void onSharedPreferenceChanged (SharedPreferences sharedPreferences , String key ) {
105+ switch (key ) {
106+ case SettingsActivity .KEY_PREF_HOST :
107+ Log .i (TAG , "Recipient host changed, reconfiguring network client" );
108+ new ConfigureNetworkingTask ().execute ();
109+ break ;
110+ }
111+ }
112+
113+
114+ // full-screen methods
115+
92116 public void switchFullScreen (MenuItem item ) {
93117 final View decorView = getWindow ().getDecorView ();
94118 int uiFlags = decorView .getSystemUiVisibility ();
@@ -97,7 +121,7 @@ public void switchFullScreen(MenuItem item) {
97121 uiFlags ^= View .SYSTEM_UI_FLAG_HIDE_NAVIGATION ;
98122 if (Build .VERSION .SDK_INT >= 16 )
99123 uiFlags ^= View .SYSTEM_UI_FLAG_FULLSCREEN ;
100- if (Build .VERSION .SDK_INT >= 18 )
124+ if (Build .VERSION .SDK_INT >= 19 )
101125 uiFlags ^= View .SYSTEM_UI_FLAG_IMMERSIVE_STICKY ;
102126
103127 decorView .setOnSystemUiVisibilityChangeListener (this );
@@ -106,16 +130,21 @@ public void switchFullScreen(MenuItem item) {
106130
107131 @ Override
108132 public void onSystemUiVisibilityChange (int visibility ) {
133+ Log .i ("GfxTablet" , "System UI changed " + visibility );
134+
135+ fullScreen = (visibility & View .SYSTEM_UI_FLAG_HIDE_NAVIGATION ) != 0 ;
136+
109137 // show/hide action bar according to full-screen mode
110- if (( visibility & View . SYSTEM_UI_FLAG_FULLSCREEN ) != 0 ) {
138+ if (fullScreen ) {
111139 CanvasActivity .this .getSupportActionBar ().hide ();
112- fullScreen = true ;
113140 Toast .makeText (CanvasActivity .this , "Press Back button to leave full-screen mode." , Toast .LENGTH_LONG ).show ();
114141 } else
115142 CanvasActivity .this .getSupportActionBar ().show ();
116143 }
117144
118145
146+ // template image logic
147+
119148 private String getTemplateImagePath () {
120149 return preferences .getString (SettingsActivity .KEY_TEMPLATE_IMAGE , null );
121150 }
@@ -143,6 +172,7 @@ public void clearTemplateImage(MenuItem item) {
143172
144173 @ Override
145174 protected void onActivityResult (int requestCode , int resultCode , Intent data ) {
175+ super .onActivityResult (requestCode , resultCode , data );
146176 if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && data != null ) {
147177 Uri selectedImage = data .getData ();
148178 String [] filePathColumn = { MediaStore .Images .Media .DATA };
@@ -159,32 +189,41 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
159189 } finally {
160190 cursor .close ();
161191 }
162- } else
163- super .onActivityResult (requestCode , resultCode , data );
192+ }
164193 }
165194
166195 public void showTemplateImage () {
167- String picturePath = preferences .getString (SettingsActivity .KEY_TEMPLATE_IMAGE , null );
168- if (picturePath != null ) {
169- Drawable drawable = BitmapDrawable .createFromPath (picturePath );
170- getWindow ().setBackgroundDrawable (drawable );
171- } else
172- getWindow ().setBackgroundDrawableResource (android .R .drawable .screen_background_light );
196+ ImageView template = (ImageView )findViewById (R .id .canvas_template );
197+ template .setImageDrawable (null );
198+
199+ if (template .getVisibility () == View .VISIBLE ) {
200+ String picturePath = preferences .getString (SettingsActivity .KEY_TEMPLATE_IMAGE , null );
201+ if (picturePath != null )
202+ try {
203+ // TODO load bitmap efficiently, for intended view size and display resolution
204+ // https://developer.android.com/training/displaying-bitmaps/load-bitmap.html
205+ final Drawable drawable = new BitmapDrawable (getResources (), picturePath );
206+ template .setImageDrawable (drawable );
207+ } catch (Exception e ) {
208+ Toast .makeText (this , e .getLocalizedMessage (), Toast .LENGTH_LONG ).show ();
209+ }
210+ }
173211 }
174212
175213
176214 private class ConfigureNetworkingTask extends AsyncTask <Void , Void , Boolean > {
177215 @ Override
178216 protected Boolean doInBackground (Void ... params ) {
179- return netClient .configureNetworking ();
217+ return netClient .reconfigureNetworking ();
180218 }
181219
182220 protected void onPostExecute (Boolean success ) {
183- if (success ) {
184- setContentView (canvas );
221+ if (success )
185222 Toast .makeText (CanvasActivity .this , "Touch events will be sent to " + netClient .destAddress .getHostAddress () + ":" + NetworkClient .GFXTABLET_PORT , Toast .LENGTH_LONG ).show ();
186- } else
187- setContentView (R .layout .activity_no_host );
223+
224+ findViewById (R .id .canvas_template ).setVisibility (success ? View .VISIBLE : View .GONE );
225+ findViewById (R .id .canvas ).setVisibility (success ? View .VISIBLE : View .GONE );
226+ findViewById (R .id .canvas_message ).setVisibility (success ? View .GONE : View .VISIBLE );
188227 }
189228 }
190229
0 commit comments