]> rtime.felk.cvut.cz Git - orte.git/blob - orte/contrib/shape_android/src/org/ocera/orte/shape_android/PublisherActivity.java
11e8bab8335a6e12e232457b91b002a31bb08aeb
[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             default:
245             }
246
247     }
248     
249     /**
250      * Creating menu.
251      * 
252      * @since 1.2
253      */
254         @Override
255         public boolean onCreateOptionsMenu(Menu menu) {
256                 // Inflate the menu; this adds items to the action bar if it is present.
257                 getMenuInflater().inflate(R.menu.publisher, menu);
258                 return true;
259         }
260         
261         /**
262          * All created publishers are in menu.
263          * @return 
264          * 
265          * @since 1.0
266          */
267         @Override
268         public boolean onPrepareOptionsMenu(Menu menu)
269         {
270                 menu.clear();
271                 
272                 if (this.actualIsPublisher) {
273                         getMenuInflater().inflate(R.menu.publisher, menu);
274                         for (PublisherShape shape : this.publisherView.shapes) {
275                                 menu.add(0, this.publisherView.shapes.indexOf(shape), 20 + this.publisherView.shapes.indexOf(shape), "#" + this.publisherView.shapes.indexOf(shape) + " " + shape.getColorName() + " " + shape.getShapeName());
276                         }
277                 } else {
278                         getMenuInflater().inflate(R.menu.subscriber, menu);
279                 }
280                 
281                 return super.onPrepareOptionsMenu(menu);
282         }
283         
284         /**
285          * Logic for menu selecting.
286          * 
287          * Contains switching between Publishers and Subscribers, adding
288          * new Publisher, setting Publishers, setting Subscribers, moving
289          * to SettingsActivity and HelpActivity.
290          * 
291          * @since 1.2
292          */
293         @SuppressLint("NewApi")
294         @Override
295         public boolean onOptionsItemSelected(MenuItem item) {
296                 // Handle action bar item clicks here. The action bar will
297                 // automatically handle clicks on the Home/Up button, so long
298                 // as you specify a parent activity in AndroidManifest.xml.
299                 final int id = item.getItemId();
300                 final Activity me = this;
301                 Intent intent;
302                 
303                 switch(id) {
304                 case R.id.action_switch:
305                         if (this.actualIsPublisher) {
306                                 this.switcher.showNext();
307                                 this.setTitle(R.string.title_activity_subscriber);
308                         } else {
309                                 this.switcher.showPrevious();
310                                 this.setTitle(R.string.title_activity_publisher);
311                         }
312                         this.actualIsPublisher = !this.actualIsPublisher;
313                         
314                         if (android.os.Build.VERSION.SDK_INT >= 11) this.invalidateOptionsMenu();
315                         
316                         return true;
317                 case R.id.action_new:
318                         String[] colors = new String[5];
319                         
320                         colors[0] = "Blue";
321                         colors[1] = "Green";
322                         colors[2] = "Red";
323                         colors[3] = "Black";
324                         colors[4] = "Yellow";
325                         
326                         AlertDialog.Builder builderNew = new AlertDialog.Builder(me);
327                         builderNew.setTitle(R.string.dialog_newPublisher)
328                         .setItems(colors, new DialogInterface.OnClickListener()
329                         {
330                                 @Override
331                                 public void onClick(DialogInterface dialog, int which)
332                                 {
333                                         // new publisher
334                                         
335                                         publisherView.addShape(which, appDomain);
336
337                                         for (PublisherShape s : publisherView.shapes) {
338                                                 s.setScale(me.getWindowManager().getDefaultDisplay().getWidth(), me.getWindowManager().getDefaultDisplay().getHeight());
339                                                 s.box.allowScaling = sp.getBoolean("prefScaling", true);
340                                         }
341                                         
342                                         if (android.os.Build.VERSION.SDK_INT >= 11) me.invalidateOptionsMenu();
343                                 }
344                         })
345                         .setNegativeButton(R.string.dialog_cancel, new DialogInterface.OnClickListener()
346                         {
347                                 @Override
348                                 public void onClick(DialogInterface dialog, int which)
349                                 {       
350                                 }
351                         });
352                         
353                         AlertDialog dialogNew = builderNew.create();
354                         dialogNew.show();
355                         
356                         return true;
357                 case R.id.action_settings:
358                         intent = new Intent(this, SettingsActivity.class);
359                         startActivityForResult(intent, RESULT_SETTINGS);
360                         return true;
361                 case R.id.action_help:
362                         intent = new Intent(this, HelpActivity.class);
363                         startActivity(intent);
364                         return true;
365                 default:
366                         // For settings of Publisher/Subscriber elements.
367                         LinearLayout l = new LinearLayout(me);
368                         l.setOrientation(LinearLayout.VERTICAL);
369                         AlertDialog.Builder builderSettings = new AlertDialog.Builder(me);
370                         
371                         if (this.actualIsPublisher) {
372                                 /*
373                                  * Parameters of Publisher shapes.
374                                  */
375                                 final int shapeStrength = publisherView.shapes.get(id).getStrength();
376                                 SeekBar seekStrength;
377                                 
378                                 /* seekBar */
379                                 seekStrength = new SeekBar(me);
380                                 seekStrength.setMax(STRENGTH_MAX);
381                                 seekStrength.setProgress(shapeStrength);
382                                 
383                                 seekStrength.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener()
384                                 {
385                                         @Override
386                                         public void onStopTrackingTouch(SeekBar seekBar) {
387                                         }
388                                         
389                                         @Override
390                                         public void onStartTrackingTouch(SeekBar seekBar) {
391                                         }
392                                         
393                                         @Override
394                                         public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
395                                         {
396                                                 publisherView.shapes.get(id).setStrength(progress);
397                                         }
398                                 });
399                                 
400                                 l.addView(seekStrength);
401                                 /* seekBar - end */
402                                 
403                                 builderSettings.setTitle("#" + id + " " + publisherView.shapes.get(id).getColorName() + " " + publisherView.shapes.get(id).getShapeName() + " strength:")
404                                 .setView(l)
405                                 .setPositiveButton(R.string.dialog_OK, new DialogInterface.OnClickListener()
406                                 {
407                                         @Override
408                                         public void onClick(DialogInterface dialog, int which)
409                                         {}
410                                 })
411                                 .setNeutralButton(R.string.dialog_delete, new DialogInterface.OnClickListener()
412                                 {       
413                                         @Override
414                                         public void onClick(DialogInterface dialog, int which) {
415                                                 publisherView.shapes.get(id).killMe();
416                                                 publisherView.shapes.remove(id);
417                                                 
418                                                 if (android.os.Build.VERSION.SDK_INT >= 11) me.invalidateOptionsMenu();
419                                         }
420                                 })
421                                 .setNegativeButton(R.string.dialog_cancel, new DialogInterface.OnClickListener()
422                                 {
423                                         @Override
424                                         public void onClick(DialogInterface dialog, int which)
425                                         {
426                                                 publisherView.shapes.get(id).setStrength(shapeStrength);
427                                         }
428                                 });
429                         
430                                 AlertDialog dialogSettings = builderSettings.create();
431                                 dialogSettings.show();
432                         } else {
433                                 /*
434                                  * Parameters of Subscriber shapes.
435                                  */
436                                 final int eId;
437                                 SeekBar seekMinSeparation;
438                                 
439                                 switch (id) {
440                                 case R.id.action_blue:
441                                         eId = 0;
442                                         break;
443                                 case R.id.action_green:
444                                         eId = 1;
445                                         break;
446                                 case R.id.action_red:
447                                         eId = 2;
448                                         break;
449                                 case R.id.action_black:
450                                         eId = 3;
451                                         break;
452                                 case R.id.action_yellow:
453                                         eId = 4;
454                                         break;
455                                 default:
456                                         eId = 0;
457                                 }
458                                 
459                                 /* seekBar */
460                                 seekMinSeparation = new SeekBar(me);
461                                 seekMinSeparation.setMax(MINSEPARATION_MAX);
462                                 seekMinSeparation.setProgress(0);
463                                 subscriberView.elements.get(eId).setMinSeparation(new NtpTime(0));
464                                 
465                                 seekMinSeparation.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener()
466                                 {
467                                         @Override
468                                         public void onStopTrackingTouch(SeekBar seekBar) {
469                                         }
470                                         
471                                         @Override
472                                         public void onStartTrackingTouch(SeekBar seekBar) {
473                                         }
474                                         
475                                         @Override
476                                         public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
477                                         {
478                                                 subscriberView.elements.get(eId).setMinSeparation(new NtpTime(progress));
479                                                 subscriberView.elements.get(eId).setEnabled(true);
480                                         }
481                                 });
482                                 
483                                 l.addView(seekMinSeparation);
484                                 /* seekBar - end */
485                                 
486                                 builderSettings.setTitle(PublisherShape.getColorName(eId) + " settings")
487                                 .setView(l)
488                                 .setPositiveButton(R.string.dialog_OK, new DialogInterface.OnClickListener()
489                                 {
490                                         @Override
491                                         public void onClick(DialogInterface dialog, int which)
492                                         {}
493                                 })
494                                 .setNeutralButton(subscriberView.elements.get(eId).getEnabled()?R.string.dialog_delete:R.string.dialog_add, new DialogInterface.OnClickListener()
495                                 {       
496                                         @Override
497                                         public void onClick(DialogInterface dialog, int which) {
498                                                 if (subscriberView.elements.get(eId).getEnabled()) {
499                                                         subscriberView.elements.get(eId).setEnabled(false);
500                                                 } else {
501                                                         subscriberView.elements.get(eId).setMinSeparation(new NtpTime(0));
502                                                         subscriberView.elements.get(eId).setEnabled(true);
503                                                 }
504                                         }
505                                 });
506                         
507                                 AlertDialog dialogSettings = builderSettings.create();
508                                 dialogSettings.show();
509                         }
510                 }
511                 
512                 return super.onOptionsItemSelected(item);
513         }
514 }