]> rtime.felk.cvut.cz Git - orte.git/blob - orte/contrib/shape_android/src/org/ocera/orte/shape_android/PublisherActivity.java
07defecfd5adf5b7c6f1f541b6fff5e9f841af42
[orte.git] / orte / contrib / shape_android / src / org / ocera / orte / shape_android / PublisherActivity.java
1 /**
2  * 
3  *      This file is part of shape_android.
4  *
5  *  shape_android is free software: you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation, either version 3 of the License, or
8  *  (at your option) any later version.
9  *
10  *  shape_android 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 shape_android.  If not, see <http://www.gnu.org/licenses/>.
17  *
18  */
19 package org.ocera.orte.shape_android;
20
21 import org.ocera.orte.DomainApp;
22 import org.ocera.orte.Manager;
23 import org.ocera.orte.types.NtpTime;
24
25 import android.annotation.SuppressLint;
26 import android.app.Activity;
27 import android.app.AlertDialog;
28 import android.content.Context;
29 import android.content.DialogInterface;
30 import android.content.Intent;
31 import android.content.SharedPreferences;
32 import android.content.res.Configuration;
33 import android.net.wifi.WifiManager;
34 import android.net.wifi.WifiManager.WifiLock;
35 import android.os.Bundle;
36 import android.os.Handler;
37 import android.os.PowerManager;
38 import android.os.PowerManager.WakeLock;
39 import android.preference.PreferenceManager;
40 import android.view.Menu;
41 import android.view.MenuItem;
42 import android.widget.LinearLayout;
43 import android.widget.SeekBar;
44 import android.widget.ViewSwitcher;
45
46 /**
47  * Class for object sent and received throw the ORTE middleware.
48  * 
49  * @author jiri hubacek <jiri.hubacek@gmail.com>
50  * @version %I, %G
51  * @since 1.2
52  */
53 public class PublisherActivity extends Activity {
54         //public final static Pattern IP_ADDRESS = Pattern.compile("((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))");
55
56         private static final int REDRAW_INTERVAL = 50;
57         private static final int STRENGTH_MAX = 5;
58         private static final int MINSEPARATION_MAX = 5;
59         private static final int RESULT_SETTINGS = 1;
60         
61         public static int SHAPE_WIDTH = 0;
62         public static int SHAPE_HEIGHT = 0;
63         
64         private PowerManager powerManager;
65         private WakeLock wakeLock;
66         
67         private WifiManager wifiManager;
68         private WifiLock wifiLock;
69         
70         private Manager orteManager;
71         private DomainApp appDomain;
72         
73         private PublisherView publisherView;
74         private SubscriberView subscriberView;
75         
76         private ViewSwitcher switcher;
77         private boolean actualIsPublisher;
78         private SharedPreferences sp;
79         
80         private Handler handler = new Handler();
81         private Runnable redraw = new Runnable()
82         {
83                 @Override
84                 public void run()
85                 {
86                         publisherView.countShapes();
87                         publisherView.invalidate();
88                         handler.postDelayed(this, REDRAW_INTERVAL);
89                 }
90         };
91         
92         /**
93          * Setting up main workspace.
94          * 
95          * @since 1.2
96          */
97         @Override
98         protected void onCreate(Bundle savedInstanceState) {
99                 super.onCreate(savedInstanceState);
100                 setContentView(R.layout.activity_publisher);
101                 
102                 // count default shape size
103                 SHAPE_WIDTH = (int) (this.getWindowManager().getDefaultDisplay().getWidth() * 25 / BoxType.DESTINATION_WIDTH);
104                 SHAPE_HEIGHT = (int) (this.getWindowManager().getDefaultDisplay().getHeight() * 45 / BoxType.DESTINATION_HEIGHT);
105                 
106                 // From Robot_Demo project.
107                 wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
108                 wifiLock = (WifiLock) wifiManager.createWifiLock((
109                                         (android.os.Build.VERSION.SDK_INT >= 12)
110                                         ? WifiManager.WIFI_MODE_FULL_HIGH_PERF
111                                         : WifiManager.WIFI_MODE_FULL
112                                 ), getClass().getName());
113                 
114                 powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
115                 wakeLock = (WakeLock) powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, getClass().getName() + " Dim");
116                 
117                 sp = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
118                 
119                 // Start ORTE.
120                 orteManager = new Manager(sp.getString("prefManagers", ""));
121                 appDomain = new DomainApp();
122                 
123                 this.switcher = (ViewSwitcher) findViewById(R.id.switcher);
124                 this.actualIsPublisher = true;
125                 
126                 this.publisherView = (PublisherView) findViewById(R.id.publisher_view);
127                 this.subscriberView = (SubscriberView) findViewById(R.id.subscriber_view);
128                 
129                 this.redraw.run();
130                 this.subscriberView.addElements(this.appDomain);
131                 for (SubscriberElement e : this.subscriberView.elements) {
132                         e.setScale(this.getWindowManager().getDefaultDisplay().getWidth(), this.getWindowManager().getDefaultDisplay().getHeight());
133                         e.setAllowScaling(sp.getBoolean("prefScaling", true));
134                 }
135         }
136
137         /**
138          * When pause activity, release WiFi lock and Wake lock.
139          * 
140          * @since 1.0
141          */
142         @Override
143         public void onPause()
144         {
145                 super.onPause();
146                 
147                 wifiLock.release();
148                 wakeLock.release();
149         }
150         
151         /**
152          * When resume activity, acquire WiFi lock and Wake lock.
153          * 
154          * @since 1.0
155          */
156         @Override
157         public void onResume()
158         {
159                 super.onResume();
160                 
161                 wifiLock.acquire();
162                 wakeLock.acquire();
163         }
164         
165         /**
166          * When switching application off.
167          * 
168          * @since 1.0
169          */
170         @Override
171         public void onDestroy()
172         {
173                 super.onDestroy();
174                 
175                 if (appDomain != null) {
176                         appDomain.destroy();
177                         appDomain = null;
178                 }
179                 if (orteManager != null) {
180                         orteManager.destroy();
181                         orteManager = null;
182                 }
183         }
184         
185         /**
186          * When screen orientation is changed,
187          * scale recalculation is needed.
188          * 
189          * @since 1.0
190          */
191         @Override
192         public void onConfigurationChanged(Configuration newConfig)
193         {
194                 super.onConfigurationChanged(newConfig);
195                 
196                 // count default shape size
197                 SHAPE_WIDTH = (int) (this.getWindowManager().getDefaultDisplay().getWidth() * 25 / BoxType.DESTINATION_WIDTH);
198                 SHAPE_HEIGHT = (int) (this.getWindowManager().getDefaultDisplay().getHeight() * 45 / BoxType.DESTINATION_HEIGHT);
199                                 
200                 for (PublisherShape s : this.publisherView.shapes) {
201                         s.setScale(this.getWindowManager().getDefaultDisplay().getWidth(), this.getWindowManager().getDefaultDisplay().getHeight());
202                 }
203                 for (SubscriberElement e : this.subscriberView.elements) {
204                         e.setScale(this.getWindowManager().getDefaultDisplay().getWidth(), this.getWindowManager().getDefaultDisplay().getHeight());
205                 }
206                 
207                 //TODO  When change rotation in Subscriber view,
208                 //              there is no change in Publisher view, which
209                 //              leads to misbehavior. For example, there
210                 //              is Publisher of Black color in Publisher view,
211                 //              and we are looking at it in Subscriber view,
212                 //              when rotation is changed, Publisher view remains
213                 //              in old rotation while Subscriber view is in new
214                 //              rotation. Therefore Black Publisher thinks that
215                 //              it's still in old rotation and the problem with
216                 //              leaving screen is here.
217         }
218
219         /**
220          * When returning from SettingsActivity, apply settings.
221          * 
222          * @since 1.2
223          */
224     @Override
225     protected void onActivityResult(int requestCode, int resultCode, Intent data)
226     {
227             super.onActivityResult(requestCode, resultCode, data);
228         
229             switch(requestCode) {
230             case RESULT_SETTINGS:
231                 boolean allowScaling = sp.getBoolean("prefScaling", true);
232
233                         for (PublisherShape s : this.publisherView.shapes) {
234                                 s.box.allowScaling = allowScaling;
235                         }
236                 for (SubscriberElement e : this.subscriberView.elements) {
237                                 e.setAllowScaling(allowScaling);
238                         }
239                 
240                 if (orteManager != null) orteManager.destroy();
241                         orteManager = new Manager(sp.getString("prefManagers", ""));
242                         
243                 break;
244             }
245
246     }
247     
248     /**
249      * Creating menu.
250      * 
251      * @since 1.2
252      */
253         @Override
254         public boolean onCreateOptionsMenu(Menu menu) {
255                 // Inflate the menu; this adds items to the action bar if it is present.
256                 getMenuInflater().inflate(R.menu.publisher, menu);
257                 return true;
258         }
259         
260         /**
261          * All created publishers are in menu.
262          * @return 
263          * 
264          * @since 1.0
265          */
266         @Override
267         public boolean onPrepareOptionsMenu(Menu menu)
268         {
269                 menu.clear();
270                 
271                 if (this.actualIsPublisher) {
272                         getMenuInflater().inflate(R.menu.publisher, menu);
273                         for (PublisherShape shape : this.publisherView.shapes) {
274                                 menu.add(0, this.publisherView.shapes.indexOf(shape), 20 + this.publisherView.shapes.indexOf(shape), "#" + this.publisherView.shapes.indexOf(shape) + " " + shape.getColorName() + " " + shape.getShapeName());
275                         }
276                 } else {
277                         getMenuInflater().inflate(R.menu.subscriber, menu);
278                 }
279                 
280                 return super.onPrepareOptionsMenu(menu);
281         }
282         
283         /**
284          * Logic for menu selecting.
285          * 
286          * Contains switching between Publishers and Subscribers, adding
287          * new Publisher, setting Publishers, setting Subscribers, moving
288          * to SettingsActivity and HelpActivity.
289          * 
290          * @since 1.2
291          */
292         @SuppressLint("NewApi")
293         @Override
294         public boolean onOptionsItemSelected(MenuItem item) {
295                 // Handle action bar item clicks here. The action bar will
296                 // automatically handle clicks on the Home/Up button, so long
297                 // as you specify a parent activity in AndroidManifest.xml.
298                 final int id = item.getItemId();
299                 final Activity me = this;
300                 Intent intent;
301                 
302                 switch(id) {
303                 case R.id.action_switch:
304                         if (this.actualIsPublisher) {
305                                 this.switcher.showNext();
306                                 this.setTitle(R.string.title_activity_subscriber);
307                         } else {
308                                 this.switcher.showPrevious();
309                                 this.setTitle(R.string.title_activity_publisher);
310                         }
311                         this.actualIsPublisher = !this.actualIsPublisher;
312                         
313                         if (android.os.Build.VERSION.SDK_INT >= 11) this.invalidateOptionsMenu();
314                         
315                         return true;
316                 case R.id.action_new:
317                         String[] colors = new String[5];
318                         
319                         colors[0] = "Blue";
320                         colors[1] = "Green";
321                         colors[2] = "Red";
322                         colors[3] = "Black";
323                         colors[4] = "Yellow";
324                         
325                         AlertDialog.Builder builderNew = new AlertDialog.Builder(me);
326                         builderNew.setTitle(R.string.dialog_newPublisher)
327                         .setItems(colors, new DialogInterface.OnClickListener()
328                         {
329                                 @Override
330                                 public void onClick(DialogInterface dialog, int which)
331                                 {
332                                         // new publisher
333                                         
334                                         publisherView.addShape(which, appDomain);
335
336                                         for (PublisherShape s : publisherView.shapes) {
337                                                 s.setScale(me.getWindowManager().getDefaultDisplay().getWidth(), me.getWindowManager().getDefaultDisplay().getHeight());
338                                                 s.box.allowScaling = sp.getBoolean("prefScaling", true);
339                                         }
340                                         
341                                         if (android.os.Build.VERSION.SDK_INT >= 11) me.invalidateOptionsMenu();
342                                 }
343                         })
344                         .setNegativeButton(R.string.dialog_cancel, new DialogInterface.OnClickListener()
345                         {
346                                 @Override
347                                 public void onClick(DialogInterface dialog, int which)
348                                 {       
349                                 }
350                         });
351                         
352                         AlertDialog dialogNew = builderNew.create();
353                         dialogNew.show();
354                         
355                         return true;
356                 case R.id.action_settings:
357                         intent = new Intent(this, SettingsActivity.class);
358                         startActivityForResult(intent, RESULT_SETTINGS);
359                         return true;
360                 case R.id.action_help:
361                         intent = new Intent(this, HelpActivity.class);
362                         startActivity(intent);
363                         return true;
364                 default:
365                         // For settings of Publisher/Subscriber elements.
366                         LinearLayout l = new LinearLayout(me);
367                         l.setOrientation(LinearLayout.VERTICAL);
368                         AlertDialog.Builder builderSettings = new AlertDialog.Builder(me);
369                         
370                         if (this.actualIsPublisher) {
371                                 /*
372                                  * Parameters of Publisher shapes.
373                                  */
374                                 final int shapeStrength = publisherView.shapes.get(id).getStrength();
375                                 SeekBar seekStrength;
376                                 
377                                 /* seekBar */
378                                 seekStrength = new SeekBar(me);
379                                 seekStrength.setMax(STRENGTH_MAX);
380                                 seekStrength.setProgress(shapeStrength);
381                                 
382                                 seekStrength.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener()
383                                 {
384                                         @Override
385                                         public void onStopTrackingTouch(SeekBar seekBar) {
386                                         }
387                                         
388                                         @Override
389                                         public void onStartTrackingTouch(SeekBar seekBar) {
390                                         }
391                                         
392                                         @Override
393                                         public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
394                                         {
395                                                 publisherView.shapes.get(id).setStrength(progress);
396                                         }
397                                 });
398                                 
399                                 l.addView(seekStrength);
400                                 /* seekBar - end */
401                                 
402                                 builderSettings.setTitle("#" + id + " " + publisherView.shapes.get(id).getColorName() + " " + publisherView.shapes.get(id).getShapeName() + " strength:")
403                                 .setView(l)
404                                 .setPositiveButton(R.string.dialog_OK, new DialogInterface.OnClickListener()
405                                 {
406                                         @Override
407                                         public void onClick(DialogInterface dialog, int which)
408                                         {}
409                                 })
410                                 .setNeutralButton(R.string.dialog_delete, new DialogInterface.OnClickListener()
411                                 {       
412                                         @Override
413                                         public void onClick(DialogInterface dialog, int which) {
414                                                 publisherView.shapes.get(id).killMe();
415                                                 publisherView.shapes.remove(id);
416                                                 
417                                                 if (android.os.Build.VERSION.SDK_INT >= 11) me.invalidateOptionsMenu();
418                                         }
419                                 })
420                                 .setNegativeButton(R.string.dialog_cancel, new DialogInterface.OnClickListener()
421                                 {
422                                         @Override
423                                         public void onClick(DialogInterface dialog, int which)
424                                         {
425                                                 publisherView.shapes.get(id).setStrength(shapeStrength);
426                                         }
427                                 });
428                         
429                                 AlertDialog dialogSettings = builderSettings.create();
430                                 dialogSettings.show();
431                         } else {
432                                 /*
433                                  * Parameters of Subscriber shapes.
434                                  */
435                                 final int eId;
436                                 SeekBar seekMinSeparation;
437                                 
438                                 switch (id) {
439                                 case R.id.action_blue:
440                                         eId = 0;
441                                         break;
442                                 case R.id.action_green:
443                                         eId = 1;
444                                         break;
445                                 case R.id.action_red:
446                                         eId = 2;
447                                         break;
448                                 case R.id.action_black:
449                                         eId = 3;
450                                         break;
451                                 case R.id.action_yellow:
452                                         eId = 4;
453                                         break;
454                                 default:
455                                         eId = 0;
456                                 }
457                                 
458                                 /* seekBar */
459                                 seekMinSeparation = new SeekBar(me);
460                                 seekMinSeparation.setMax(MINSEPARATION_MAX);
461                                 seekMinSeparation.setProgress(0);
462                                 subscriberView.elements.get(eId).setMinSeparation(new NtpTime(0));
463                                 
464                                 seekMinSeparation.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener()
465                                 {
466                                         @Override
467                                         public void onStopTrackingTouch(SeekBar seekBar) {
468                                         }
469                                         
470                                         @Override
471                                         public void onStartTrackingTouch(SeekBar seekBar) {
472                                         }
473                                         
474                                         @Override
475                                         public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
476                                         {
477                                                 subscriberView.elements.get(eId).setMinSeparation(new NtpTime(progress));
478                                                 subscriberView.elements.get(eId).setEnabled(true);
479                                         }
480                                 });
481                                 
482                                 l.addView(seekMinSeparation);
483                                 /* seekBar - end */
484                                 
485                                 builderSettings.setTitle(PublisherShape.getColorName(eId) + " settings")
486                                 .setView(l)
487                                 .setPositiveButton(R.string.dialog_OK, new DialogInterface.OnClickListener()
488                                 {
489                                         @Override
490                                         public void onClick(DialogInterface dialog, int which)
491                                         {}
492                                 })
493                                 .setNeutralButton(subscriberView.elements.get(eId).getEnabled()?R.string.dialog_delete:R.string.dialog_add, new DialogInterface.OnClickListener()
494                                 {       
495                                         @Override
496                                         public void onClick(DialogInterface dialog, int which) {
497                                                 if (subscriberView.elements.get(eId).getEnabled()) {
498                                                         subscriberView.elements.get(eId).setEnabled(false);
499                                                 } else {
500                                                         subscriberView.elements.get(eId).setMinSeparation(new NtpTime(0));
501                                                         subscriberView.elements.get(eId).setEnabled(true);
502                                                 }
503                                         }
504                                 });
505                         
506                                 AlertDialog dialogSettings = builderSettings.create();
507                                 dialogSettings.show();
508                         }
509                 }
510                 
511                 return super.onOptionsItemSelected(item);
512         }
513 }