9
9
import android .os .AsyncTask ;
10
10
import android .os .Build ;
11
11
import android .os .Bundle ;
12
+ import android .preference .PreferenceFragment ;
12
13
import android .preference .PreferenceManager ;
13
14
import android .provider .MediaStore ;
14
- import android .support .v7 .app .ActionBarActivity ;
15
+ import android .support .v7 .app .AppCompatActivity ;
15
16
import android .support .v7 .widget .PopupMenu ;
17
+ import android .util .Log ;
16
18
import android .view .Menu ;
17
19
import android .view .MenuItem ;
18
20
import android .view .View ;
19
21
import android .view .WindowManager ;
22
+ import android .widget .ImageView ;
20
23
import android .widget .Toast ;
21
24
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/" ));
24
30
25
31
NetworkClient netClient ;
26
- CanvasView canvas ;
27
32
28
33
SharedPreferences preferences ;
29
34
boolean fullScreen = false ;
@@ -34,18 +39,18 @@ protected void onCreate(Bundle savedInstanceState) {
34
39
super .onCreate (savedInstanceState );
35
40
36
41
preferences = PreferenceManager .getDefaultSharedPreferences (this );
42
+ preferences .registerOnSharedPreferenceChangeListener (this );
43
+
44
+ setContentView (R .layout .activity_canvas );
37
45
46
+ // create network client in a separate thread
38
47
netClient = new NetworkClient (PreferenceManager .getDefaultSharedPreferences (this ));
39
48
new Thread (netClient ).start ();
40
-
41
- canvas = new CanvasView (CanvasActivity .this , netClient );
42
- }
43
-
44
- @ Override
45
- protected void onStart () {
46
- super .onStart ();
47
-
48
49
new ConfigureNetworkingTask ().execute ();
50
+
51
+ // notify CanvasView of the network client
52
+ CanvasView canvas = (CanvasView )findViewById (R .id .canvas );
53
+ canvas .setNetworkClient (netClient );
49
54
}
50
55
51
56
@ Override
@@ -61,9 +66,9 @@ protected void onResume() {
61
66
}
62
67
63
68
@ Override
64
- protected void onStop () {
69
+ protected void onDestroy () {
70
+ super .onDestroy ();
65
71
netClient .getQueue ().add (new NetEvent (NetEvent .Type .TYPE_DISCONNECT ));
66
- super .onStop ();
67
72
}
68
73
69
74
@ Override
@@ -81,14 +86,33 @@ public void onBackPressed() {
81
86
}
82
87
83
88
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 ()));
85
94
}
86
95
87
96
public void showSettings (MenuItem item ) {
88
97
startActivityForResult (new Intent (this , SettingsActivity .class ), 0 );
89
98
}
90
99
91
100
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
+
92
116
public void switchFullScreen (MenuItem item ) {
93
117
final View decorView = getWindow ().getDecorView ();
94
118
int uiFlags = decorView .getSystemUiVisibility ();
@@ -97,7 +121,7 @@ public void switchFullScreen(MenuItem item) {
97
121
uiFlags ^= View .SYSTEM_UI_FLAG_HIDE_NAVIGATION ;
98
122
if (Build .VERSION .SDK_INT >= 16 )
99
123
uiFlags ^= View .SYSTEM_UI_FLAG_FULLSCREEN ;
100
- if (Build .VERSION .SDK_INT >= 18 )
124
+ if (Build .VERSION .SDK_INT >= 19 )
101
125
uiFlags ^= View .SYSTEM_UI_FLAG_IMMERSIVE_STICKY ;
102
126
103
127
decorView .setOnSystemUiVisibilityChangeListener (this );
@@ -106,16 +130,21 @@ public void switchFullScreen(MenuItem item) {
106
130
107
131
@ Override
108
132
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
+
109
137
// show/hide action bar according to full-screen mode
110
- if (( visibility & View . SYSTEM_UI_FLAG_FULLSCREEN ) != 0 ) {
138
+ if (fullScreen ) {
111
139
CanvasActivity .this .getSupportActionBar ().hide ();
112
- fullScreen = true ;
113
140
Toast .makeText (CanvasActivity .this , "Press Back button to leave full-screen mode." , Toast .LENGTH_LONG ).show ();
114
141
} else
115
142
CanvasActivity .this .getSupportActionBar ().show ();
116
143
}
117
144
118
145
146
+ // template image logic
147
+
119
148
private String getTemplateImagePath () {
120
149
return preferences .getString (SettingsActivity .KEY_TEMPLATE_IMAGE , null );
121
150
}
@@ -143,6 +172,7 @@ public void clearTemplateImage(MenuItem item) {
143
172
144
173
@ Override
145
174
protected void onActivityResult (int requestCode , int resultCode , Intent data ) {
175
+ super .onActivityResult (requestCode , resultCode , data );
146
176
if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && data != null ) {
147
177
Uri selectedImage = data .getData ();
148
178
String [] filePathColumn = { MediaStore .Images .Media .DATA };
@@ -159,32 +189,41 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
159
189
} finally {
160
190
cursor .close ();
161
191
}
162
- } else
163
- super .onActivityResult (requestCode , resultCode , data );
192
+ }
164
193
}
165
194
166
195
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
+ }
173
211
}
174
212
175
213
176
214
private class ConfigureNetworkingTask extends AsyncTask <Void , Void , Boolean > {
177
215
@ Override
178
216
protected Boolean doInBackground (Void ... params ) {
179
- return netClient .configureNetworking ();
217
+ return netClient .reconfigureNetworking ();
180
218
}
181
219
182
220
protected void onPostExecute (Boolean success ) {
183
- if (success ) {
184
- setContentView (canvas );
221
+ if (success )
185
222
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 );
188
227
}
189
228
}
190
229
0 commit comments