diff options
16 files changed, 1279 insertions, 1144 deletions
diff --git a/android/sdremote/AndroidManifest.xml b/android/sdremote/AndroidManifest.xml index 10041933a41f..33d194fbe0b2 100644 --- a/android/sdremote/AndroidManifest.xml +++ b/android/sdremote/AndroidManifest.xml @@ -20,21 +20,14 @@ <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> - <activity - android:name=".communication.TestClient" - android:label="Remote--Direct" > - <intent-filter> - <action android:name="android.intent.action.MAIN" /> - - <category android:name="android.intent.category.LAUNCHER" /> - </intent-filter> - </activity> <service android:name=".communication.CommunicationService" > </service> <activity android:name=".PairingActivity" > </activity> + <activity android:name=".StartPresentationActivity" > + </activity> <activity android:name=".PresentationActivity" android:label="@string/title_activity_presentation" > diff --git a/android/sdremote/res/drawable/image_loading.png b/android/sdremote/res/drawable/image_loading.png Binary files differnew file mode 100644 index 000000000000..24e8ebdf12b2 --- /dev/null +++ b/android/sdremote/res/drawable/image_loading.png diff --git a/android/sdremote/res/layout-land/fragment_presentation.xml b/android/sdremote/res/layout-land/fragment_presentation.xml index 1cdd4d3f3312..66de90528808 100644 --- a/android/sdremote/res/layout-land/fragment_presentation.xml +++ b/android/sdremote/res/layout-land/fragment_presentation.xml @@ -13,8 +13,8 @@ <pl.polidea.coverflow.CoverFlow xmlns:coverflow="http://schemas.android.com/apk/res/org.libreoffice.impressremote" android:id="@+id/presentation_coverflow" - android:layout_width="fill_parent" - android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:layout_height="match_parent" android:layout_marginTop="5dip" coverflow:imageHeight="150dip" coverflow:imageWidth="180dip" @@ -42,8 +42,8 @@ <ScrollView android:id="@+id/presentation_scrollview" - android:layout_width="match_parent" - android:layout_height="wrap_content" > + android:layout_width="wrap_content" + android:layout_height="match_parent" > <WebView android:id="@+id/presentation_notes" diff --git a/android/sdremote/res/layout/activity_startpresentation.xml b/android/sdremote/res/layout/activity_startpresentation.xml new file mode 100644 index 000000000000..25bf55ab86d0 --- /dev/null +++ b/android/sdremote/res/layout/activity_startpresentation.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" > + + <TextView + android:id="@+id/startpresentation_instruction" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal" + android:layout_margin="5dip" + android:text="@string/startpresentation_instruction" /> + + <Button + android:id="@+id/startpresentation_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal" + android:text="@string/startpresentation_button" /> + +</LinearLayout>
\ No newline at end of file diff --git a/android/sdremote/res/values/strings.xml b/android/sdremote/res/values/strings.xml index c86d5c92c94c..060652cdc2e6 100644 --- a/android/sdremote/res/values/strings.xml +++ b/android/sdremote/res/values/strings.xml @@ -24,7 +24,9 @@ <string name="wifi">WI-FI</string> <string name="selector_noservers">Searching for computers…</string> <string name="pairing_instructions_1">In Impress, click on the "Slideshow" menu and select "Impress Remote".</string> - <string name="pairing_instructions_2_deviceName">Choose "{1}" as your device.</string> + <string name="pairing_instructions_2_deviceName">Choose \"{0}\" as your device.</string> <string name="pairing_instructions_3">Then input this PIN:</string> + <string name="startpresentation_instruction">No presentation is currently running.</string> + <string name="startpresentation_button">Start Presentation</string> </resources>
\ No newline at end of file diff --git a/android/sdremote/src/org/libreoffice/impressremote/PairingActivity.java b/android/sdremote/src/org/libreoffice/impressremote/PairingActivity.java index 9298e437625f..414bcd479f0d 100644 --- a/android/sdremote/src/org/libreoffice/impressremote/PairingActivity.java +++ b/android/sdremote/src/org/libreoffice/impressremote/PairingActivity.java @@ -39,21 +39,12 @@ public class PairingActivity extends Activity { Context.BIND_IMPORTANT); mIsBound = true; - mPinText = (TextView) findViewById(R.id.pairing_pin); - IntentFilter aFilter = new IntentFilter( CommunicationService.MSG_PAIRING_STARTED); aFilter.addAction(CommunicationService.MSG_PAIRING_SUCCESSFUL); LocalBroadcastManager.getInstance(this).registerReceiver(mListener, aFilter); - // mBluetoothContainer = findViewById(R.id.selector_container_bluetooth); - // mBluetoothList = (LinearLayout) findViewById(R.id.selector_list_bluetooth); - // mNetworkContainer = findViewById(R.id.selector_container_network); - // mNetworkList = (LinearLayout) findViewById(R.id.selector_list_network); - // mNoServerLabel = (TextView) findViewById(R.id.selector_label_none); - // - // refreshLists(); } private ServiceConnection mConnection = new ServiceConnection() { @@ -61,7 +52,9 @@ public class PairingActivity extends Activity { public void onServiceConnected(ComponentName aClassName, IBinder aService) { setContentView(R.layout.activity_pairing); - + mPinText = (TextView) findViewById(R.id.pairing_pin); + mCommunicationService = ((CommunicationService.CBinder) aService) + .getService(); ((TextView) findViewById(R.id.pairing_instruction2_deviceName)) .setText(MessageFormat .format(getResources() @@ -69,8 +62,6 @@ public class PairingActivity extends Activity { mCommunicationService .getDeviceName())); - mCommunicationService = ((CommunicationService.CBinder) aService) - .getService(); if (mCommunicationService.getState() == State.CONNECTING) { mPinText.setText(mCommunicationService.getPairingPin()); } @@ -94,7 +85,9 @@ public class PairingActivity extends Activity { // refreshLists(); } else if (aIntent.getAction().equals( CommunicationService.MSG_PAIRING_SUCCESSFUL)) { - mPinText.setText("Paired!"); + Intent nIntent = new Intent(PairingActivity.this, + StartPresentationActivity.class); + startActivity(nIntent); } } diff --git a/android/sdremote/src/org/libreoffice/impressremote/PresentationActivity.java b/android/sdremote/src/org/libreoffice/impressremote/PresentationActivity.java index c6b80fecdea3..912059d06999 100644 --- a/android/sdremote/src/org/libreoffice/impressremote/PresentationActivity.java +++ b/android/sdremote/src/org/libreoffice/impressremote/PresentationActivity.java @@ -7,7 +7,6 @@ import java.util.TimeZone; import org.libreoffice.impressremote.communication.CommunicationService; import org.libreoffice.impressremote.communication.SlideShow.Timer; -import android.annotation.SuppressLint; import android.app.ActionBar; import android.app.Activity; import android.app.FragmentManager; @@ -20,8 +19,6 @@ import android.content.SharedPreferences; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; -import android.os.Message; -import android.os.Messenger; import android.preference.PreferenceManager; import android.text.format.DateFormat; import android.view.KeyEvent; @@ -38,446 +35,450 @@ import android.widget.TextView; import android.widget.ToggleButton; public class PresentationActivity extends Activity { - private CommunicationService mCommunicationService; - private boolean mIsBound = false; - private FrameLayout mLayout; - private FrameLayout mOuterLayout; - private ThumbnailFragment mThumbnailFragment; - private PresentationFragment mPresentationFragment; - private ActionBarManager mActionBarManager; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - bindService(new Intent(this, CommunicationService.class), mConnection, - Context.BIND_IMPORTANT); - mIsBound = true; - - setContentView(R.layout.activity_presentation); - mOuterLayout = (FrameLayout) findViewById(R.id.framelayout); - mLayout = new InterceptorLayout(this); - mOuterLayout.addView(mLayout); - mLayout.setId(R.id.presentation_innerFrame); - // ((FrameLayout) findViewById(R.id.framelayout)).addView(mLayout); - mThumbnailFragment = new ThumbnailFragment(); - mPresentationFragment = new PresentationFragment(); - - FragmentManager fragmentManager = getFragmentManager(); - FragmentTransaction fragmentTransaction = fragmentManager - .beginTransaction(); - fragmentTransaction.add(R.id.presentation_innerFrame, - mPresentationFragment, "fragment_presentation"); - fragmentTransaction.commit(); - } - - @Override - public boolean dispatchKeyEvent(KeyEvent event) { - SharedPreferences aPref = PreferenceManager - .getDefaultSharedPreferences(this); - boolean aVolumeSwitching = aPref.getBoolean("option_volumeswitching", - false); - boolean aRelevantFragmentVisible = mPresentationFragment.isVisible() - || mThumbnailFragment.isVisible(); - if (aVolumeSwitching && aRelevantFragmentVisible) { - - int action = event.getAction(); - int keyCode = event.getKeyCode(); - switch (keyCode) { - case KeyEvent.KEYCODE_VOLUME_UP: - if (action == KeyEvent.ACTION_UP) { - mCommunicationService.getTransmitter().nextTransition(); - } - return true; - case KeyEvent.KEYCODE_VOLUME_DOWN: - if (action == KeyEvent.ACTION_DOWN) { - mCommunicationService.getTransmitter().previousTransition(); - } - return true; - } - } - return super.dispatchKeyEvent(event); - } - - private ServiceConnection mConnection = new ServiceConnection() { - @Override - public void onServiceConnected(ComponentName aClassName, - IBinder aService) { - mCommunicationService = ((CommunicationService.CBinder) aService) - .getService(); - mCommunicationService.setActivityMessenger(mMessenger); - - mPresentationFragment - .setCommunicationService(mCommunicationService); - mThumbnailFragment.setCommunicationService(mCommunicationService); - - } - - @Override - public void onServiceDisconnected(ComponentName aClassName) { - mCommunicationService = null; - } - }; - - final Messenger mMessenger = new Messenger(new MessageHandler()); - - @SuppressLint("HandlerLeak") - protected class MessageHandler extends Handler { - @Override - public void handleMessage(Message aMessage) { - mPresentationFragment.handleMessage(aMessage); - mThumbnailFragment.handleMessage(aMessage); - } - } - - // ---------------------------------------------- ACTION BAR --------------- - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.actionbar_presentation, menu); - mActionBarManager = new ActionBarManager(); - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - Intent aIntent; - switch (item.getItemId()) { - case R.id.actionbar_presentation_submenu_options: - - aIntent = new Intent(this, SettingsActivity.class); - startActivity(aIntent); - return true; - case R.id.actionbar_presentation_submenu_blank: - boolean aRelevantFragmentVisible = mPresentationFragment - .isVisible() || mThumbnailFragment.isVisible(); - if (aRelevantFragmentVisible) { - - BlankScreenFragment aFragment = new BlankScreenFragment( - mCommunicationService); - - FragmentTransaction ft = getFragmentManager() - .beginTransaction(); - ft.replace(R.id.presentation_innerFrame, aFragment); - ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); - ft.addToBackStack(null); - ft.commit(); - } - return true; - default: - return super.onOptionsItemSelected(item); - } - } - - private class ActionBarManager implements OnClickListener, - FragmentManager.OnBackStackChangedListener, - TextView.OnEditorActionListener { - - private ToggleButton mTimeLabel; - private ToggleButton mThumbnailButton; - - private View mDropdownOptions; - private View mDropdownBlank; - - // ------- CLOCKBAR - private View mClockBar; - private ToggleButton mClockBar_clockButton; - private ToggleButton mClockBar_stopwatchButton; - private ToggleButton mClockBar_countdownButton; - - // ------- STOPWATCH BAR - private View mStopwatchBar; - private Button mStopwatchButtonRun; - private Button mStopwatchButtonReset; - - // ------- COUNTDOWN BAR - private View mCountdownBar; - private EditText mCountdownEntry; - private Button mCountdownButton; - - private String aTimeFormat = getResources().getString( - R.string.actionbar_timeformat); - private String aTimerFormat = getResources().getString( - R.string.actionbar_timerformat); - /* - * True if the timer is being used as a timer, false if we are showing a - * clock. - */ - private boolean mTimerOn = false; - - public ActionBarManager() { - - ActionBar aBar = getActionBar(); - aBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); - aBar.setCustomView(R.layout.presentation_actionbar); - - mThumbnailButton = (ToggleButton) aBar.getCustomView() - .findViewById(R.id.actionbar_thumbnailtoggle); - mThumbnailButton.setOnClickListener(this); - - mTimeLabel = (ToggleButton) aBar.getCustomView().findViewById( - R.id.actionbar_time); - mTimeLabel.setOnClickListener(this); - - setupClockBar(); - - getFragmentManager().addOnBackStackChangedListener(this); - - timerHandler.removeCallbacks(timerUpdateThread); - timerHandler.postDelayed(timerUpdateThread, 50); - - } - - public void hidePopups() { - if (mClockBar.getVisibility() == View.VISIBLE) { - mClockBar.setVisibility(View.INVISIBLE); - mStopwatchBar.setVisibility(View.INVISIBLE); - mCountdownBar.setVisibility(View.INVISIBLE); - mTimeLabel.setChecked(false); - } - } - - private void setupClockBar() { - // ClockBar - LayoutInflater aInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); - aInflater.inflate(R.layout.presentation_clockbar, mOuterLayout); - mClockBar = mOuterLayout.findViewById(R.id.clockbar); - - mClockBar_clockButton = (ToggleButton) mClockBar - .findViewById(R.id.clockbar_toggle_clockmode); - mClockBar_stopwatchButton = (ToggleButton) mClockBar - .findViewById(R.id.clockbar_toggle_stopwatchmode); - mClockBar_countdownButton = (ToggleButton) mClockBar - .findViewById(R.id.clockbar_toggle_countdownmode); - mClockBar_clockButton.setOnClickListener(this); - mClockBar_stopwatchButton.setOnClickListener(this); - mClockBar_countdownButton.setOnClickListener(this); - - // Stopwatch bar - aInflater.inflate(R.layout.presentation_clockbar_stopwatchbar, - mOuterLayout); - mStopwatchBar = mOuterLayout - .findViewById(R.id.clockbar_stopwatchbar); - - mStopwatchButtonRun = (Button) mStopwatchBar - .findViewById(R.id.clockbar_stopwatch_run); - mStopwatchButtonReset = (Button) mStopwatchBar - .findViewById(R.id.clockbar_stopwatch_reset); - mStopwatchButtonRun.setOnClickListener(this); - mStopwatchButtonReset.setOnClickListener(this); - - // Countdown bar - aInflater.inflate(R.layout.presentation_clockbar_countdownbar, - mOuterLayout); - mCountdownBar = mOuterLayout - .findViewById(R.id.clockbar_countdownbar); - - mCountdownEntry = (EditText) mCountdownBar - .findViewById(R.id.clockbar_countdown_time); - mCountdownButton = (Button) mCountdownBar - .findViewById(R.id.clockbar_countdown_button); - mCountdownButton.setOnClickListener(this); - mCountdownEntry.setOnEditorActionListener(this); - - updateClockBar(); - hidePopups(); - - } - - private void updateClockBar() { - mClockBar_clockButton.setChecked(!mTimerOn); - - mCountdownBar.setY(mClockBar.getHeight()); - mStopwatchBar.setY(mClockBar.getHeight()); - - boolean aIsCountdown = mCommunicationService.getSlideShow() - .getTimer().isCountdown(); - // Stopwatch - boolean aStopwatchMode = mTimerOn && !aIsCountdown; - mClockBar_stopwatchButton.setChecked(aStopwatchMode); - mStopwatchBar.setVisibility(aStopwatchMode ? View.VISIBLE - : View.INVISIBLE); - mStopwatchBar.bringToFront(); - if (aStopwatchMode) { - Timer aTimer = mCommunicationService.getSlideShow().getTimer(); - if (aTimer.isRunning()) { - mStopwatchButtonRun.setText(R.string.clock_timer_pause); - mStopwatchButtonReset.setText(R.string.clock_timer_restart); - } else { - mStopwatchButtonRun.setText(R.string.clock_timer_start); - mStopwatchButtonReset.setText(R.string.clock_timer_reset); - } - } - - // Countdown - boolean aCountdownMode = mTimerOn && aIsCountdown; - mClockBar_countdownButton.setChecked(mTimerOn && aIsCountdown); - mCountdownBar.setVisibility(mTimerOn && aIsCountdown ? View.VISIBLE - : View.INVISIBLE); - mCountdownBar.bringToFront(); - if (aCountdownMode) { - Timer aTimer = mCommunicationService.getSlideShow().getTimer(); - if (aTimer.isRunning()) { - mCountdownButton.setText(R.string.clock_timer_pause); - } else { - mCountdownButton.setText(R.string.clock_timer_resume); - } - } - - } - - private Handler timerHandler = new Handler(); - - private Thread timerUpdateThread = new Thread() { - - @Override - public void run() { - // invalidateOptionsMenu(); - CharSequence aTimeString; - long aTime = mCommunicationService.getSlideShow().getTimer() - .getTimeMillis(); - if (mTimerOn) { - aTimeString = DateFormat.format(aTimerFormat, aTime); - } else { - aTimeString = DateFormat.format(aTimeFormat, - System.currentTimeMillis()); - } - mTimeLabel.setText(aTimeString); - // TODO: set the string - timerHandler.postDelayed(this, 50); - - } - - }; - - @Override - public void onClick(View aSource) { - Timer aTimer = mCommunicationService.getSlideShow().getTimer(); - // --------------------------------- ACTIONBAR BUTTONS ------------- - if (aSource == mThumbnailButton) { - if (!mThumbnailFragment.isVisible()) { - FragmentTransaction ft = getFragmentManager() - .beginTransaction(); - ft.replace(R.id.presentation_innerFrame, mThumbnailFragment); - ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); - ft.addToBackStack(null); - ft.commit(); - } else { - getFragmentManager().popBackStack(); - } - } else if (aSource == mTimeLabel) { - if (mClockBar.getVisibility() == View.VISIBLE) { - hidePopups(); - } else { - mClockBar.setVisibility(View.VISIBLE); - updateClockBar(); - mClockBar.bringToFront(); - } - } - // ------------------------------------ CLOCKBAR BUTTONS ----------- - else if (aSource == mClockBar_clockButton) { - mTimerOn = false; - updateClockBar(); - } else if (aSource == mClockBar_stopwatchButton) { - mTimerOn = true; - if (aTimer.isCountdown()) { // Changing mode. - aTimer.reset(); - } - aTimer.setCountdown(false); - updateClockBar(); - } else if (aSource == mClockBar_countdownButton) { - mTimerOn = true; - if (!aTimer.isCountdown()) { // Changing mode - aTimer.reset(); - } - aTimer.setCountdown(true); - updateClockBar(); - } - // ------------------------------------- TIMER BUTTONS - else if (aSource == mStopwatchButtonRun) { - if (aTimer.isRunning()) { - aTimer.stopTimer(); - } else { - aTimer.startTimer(); - } - updateClockBar(); - } else if (aSource == mStopwatchButtonReset) { - if (aTimer.isRunning()) { - aTimer.reset(); - aTimer.startTimer(); - } else { - aTimer.reset(); - } - updateClockBar(); - } else if (aSource == mCountdownButton) { - if (aTimer.isRunning()) { - aTimer.stopTimer(); - } else { - aTimer.startTimer(); - } - updateClockBar(); - } - - } - - @Override - public void onBackStackChanged() { - if (getFragmentManager().getBackStackEntryCount() == 0) { - mThumbnailButton.setChecked(false); - } - } - - @Override - public boolean onEditorAction(TextView tv, int aID, KeyEvent aEvent) { - if (aEvent.getKeyCode() == KeyEvent.KEYCODE_ENTER) { - - long aTime = 0; - try { - SimpleDateFormat aFormat = new SimpleDateFormat("HH:mm:ss"); - aFormat.setTimeZone(TimeZone.getTimeZone("UTC")); - aTime = aFormat.parse(mCountdownEntry.getText().toString()) - .getTime(); - } catch (ParseException e) { - } - if (aTime == 0) { - try { - SimpleDateFormat aFormat = new SimpleDateFormat("mm:ss"); - aFormat.setTimeZone(TimeZone.getTimeZone("UTC")); - aTime = aFormat.parse( - mCountdownEntry.getText().toString()) - .getTime(); - } catch (ParseException e) { - } - } - mCommunicationService.getSlideShow().getTimer() - .setCountdownTime(aTime); - return true; - } - return false; - } - } - - /** - * Intermediate layout that catches all touches, used in order to hide - * the clock menu as appropriate. - * @author andy - * - */ - private class InterceptorLayout extends FrameLayout { - - public InterceptorLayout(Context context) { - super(context); - } - - @Override - public boolean onInterceptTouchEvent(MotionEvent aEvent) { - mActionBarManager.hidePopups(); - return super.onInterceptTouchEvent(aEvent); - } - - @Override - public boolean onTouchEvent(MotionEvent aEvent) { - return super.onTouchEvent(aEvent); - } - - } + private CommunicationService mCommunicationService; + private boolean mIsBound = false; + private FrameLayout mLayout; + private FrameLayout mOuterLayout; + private ThumbnailFragment mThumbnailFragment; + private PresentationFragment mPresentationFragment; + private ActionBarManager mActionBarManager; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + bindService(new Intent(this, CommunicationService.class), mConnection, + Context.BIND_IMPORTANT); + mIsBound = true; + + setContentView(R.layout.activity_presentation); + mOuterLayout = (FrameLayout) findViewById(R.id.framelayout); + mOuterLayout.removeAllViews(); + mLayout = new InterceptorLayout(this); + mOuterLayout.addView(mLayout); + mLayout.setId(R.id.presentation_innerFrame); + + //((FrameLayout) findViewById(R.id.framelayout)).addView(mLayout); + mThumbnailFragment = new ThumbnailFragment(); + mPresentationFragment = new PresentationFragment(); + + FragmentManager fragmentManager = getFragmentManager(); + FragmentTransaction fragmentTransaction = fragmentManager + .beginTransaction(); + fragmentTransaction.add(R.id.presentation_innerFrame, + mPresentationFragment, "fragment_presentation"); + fragmentTransaction.commit(); + + } + + @Override + protected void onDestroy() { + mActionBarManager.stop(); + super.onDestroy(); + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + SharedPreferences aPref = PreferenceManager + .getDefaultSharedPreferences(this); + boolean aVolumeSwitching = aPref.getBoolean("option_volumeswitching", + false); + boolean aRelevantFragmentVisible = mPresentationFragment.isVisible() + || mThumbnailFragment.isVisible(); + if (aVolumeSwitching && aRelevantFragmentVisible) { + + int action = event.getAction(); + int keyCode = event.getKeyCode(); + switch (keyCode) { + case KeyEvent.KEYCODE_VOLUME_UP: + if (action == KeyEvent.ACTION_UP) { + mCommunicationService.getTransmitter().nextTransition(); + } + return true; + case KeyEvent.KEYCODE_VOLUME_DOWN: + if (action == KeyEvent.ACTION_DOWN) { + mCommunicationService.getTransmitter().previousTransition(); + } + return true; + } + } + return super.dispatchKeyEvent(event); + } + + private ServiceConnection mConnection = new ServiceConnection() { + @Override + public void onServiceConnected(ComponentName aClassName, + IBinder aService) { + mCommunicationService = ((CommunicationService.CBinder) aService) + .getService(); + + mPresentationFragment + .setCommunicationService(mCommunicationService); + mThumbnailFragment.setCommunicationService(mCommunicationService); + + } + + @Override + public void onServiceDisconnected(ComponentName aClassName) { + mCommunicationService = null; + } + }; + + // ---------------------------------------------- ACTION BAR --------------- + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.actionbar_presentation, menu); + mActionBarManager = new ActionBarManager(); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + Intent aIntent; + switch (item.getItemId()) { + case R.id.actionbar_presentation_submenu_options: + + aIntent = new Intent(this, SettingsActivity.class); + startActivity(aIntent); + return true; + case R.id.actionbar_presentation_submenu_blank: + boolean aRelevantFragmentVisible = mPresentationFragment + .isVisible() || mThumbnailFragment.isVisible(); + if (aRelevantFragmentVisible) { + + BlankScreenFragment aFragment = new BlankScreenFragment( + mCommunicationService); + + FragmentTransaction ft = getFragmentManager() + .beginTransaction(); + ft.replace(R.id.presentation_innerFrame, aFragment); + ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); + ft.addToBackStack(null); + ft.commit(); + } + return true; + default: + return super.onOptionsItemSelected(item); + } + } + + private class ActionBarManager implements OnClickListener, + FragmentManager.OnBackStackChangedListener, + TextView.OnEditorActionListener { + + private Handler timerHandler = new Handler(); + + private ToggleButton mTimeLabel; + private ToggleButton mThumbnailButton; + + private View mDropdownOptions; + private View mDropdownBlank; + + // ------- CLOCKBAR + private View mClockBar; + private ToggleButton mClockBar_clockButton; + private ToggleButton mClockBar_stopwatchButton; + private ToggleButton mClockBar_countdownButton; + + // ------- STOPWATCH BAR + private View mStopwatchBar; + private Button mStopwatchButtonRun; + private Button mStopwatchButtonReset; + + // ------- COUNTDOWN BAR + private View mCountdownBar; + private EditText mCountdownEntry; + private Button mCountdownButton; + + private String aTimeFormat = getResources().getString( + R.string.actionbar_timeformat); + private String aTimerFormat = getResources().getString( + R.string.actionbar_timerformat); + /* + * True if the timer is being used as a timer, false if we are showing a + * clock. + */ + private boolean mTimerOn = false; + + public void stop() { + timerHandler.removeCallbacks(timerUpdateThread); + } + + public ActionBarManager() { + + ActionBar aBar = getActionBar(); + aBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); + aBar.setCustomView(R.layout.presentation_actionbar); + + mThumbnailButton = (ToggleButton) aBar.getCustomView() + .findViewById(R.id.actionbar_thumbnailtoggle); + mThumbnailButton.setOnClickListener(this); + + mTimeLabel = (ToggleButton) aBar.getCustomView().findViewById( + R.id.actionbar_time); + mTimeLabel.setOnClickListener(this); + + setupClockBar(); + + getFragmentManager().addOnBackStackChangedListener(this); + + timerHandler.removeCallbacks(timerUpdateThread); + timerHandler.postDelayed(timerUpdateThread, 50); + + } + + public void hidePopups() { + if (mClockBar.getVisibility() == View.VISIBLE) { + mClockBar.setVisibility(View.INVISIBLE); + mStopwatchBar.setVisibility(View.INVISIBLE); + mCountdownBar.setVisibility(View.INVISIBLE); + mTimeLabel.setChecked(false); + } + } + + private void setupClockBar() { + // ClockBar + LayoutInflater aInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); + aInflater.inflate(R.layout.presentation_clockbar, mOuterLayout); + mClockBar = mOuterLayout.findViewById(R.id.clockbar); + + mClockBar_clockButton = (ToggleButton) mClockBar + .findViewById(R.id.clockbar_toggle_clockmode); + mClockBar_stopwatchButton = (ToggleButton) mClockBar + .findViewById(R.id.clockbar_toggle_stopwatchmode); + mClockBar_countdownButton = (ToggleButton) mClockBar + .findViewById(R.id.clockbar_toggle_countdownmode); + mClockBar_clockButton.setOnClickListener(this); + mClockBar_stopwatchButton.setOnClickListener(this); + mClockBar_countdownButton.setOnClickListener(this); + + // Stopwatch bar + aInflater.inflate(R.layout.presentation_clockbar_stopwatchbar, + mOuterLayout); + mStopwatchBar = mOuterLayout + .findViewById(R.id.clockbar_stopwatchbar); + + mStopwatchButtonRun = (Button) mStopwatchBar + .findViewById(R.id.clockbar_stopwatch_run); + mStopwatchButtonReset = (Button) mStopwatchBar + .findViewById(R.id.clockbar_stopwatch_reset); + mStopwatchButtonRun.setOnClickListener(this); + mStopwatchButtonReset.setOnClickListener(this); + + // Countdown bar + aInflater.inflate(R.layout.presentation_clockbar_countdownbar, + mOuterLayout); + mCountdownBar = mOuterLayout + .findViewById(R.id.clockbar_countdownbar); + + mCountdownEntry = (EditText) mCountdownBar + .findViewById(R.id.clockbar_countdown_time); + mCountdownButton = (Button) mCountdownBar + .findViewById(R.id.clockbar_countdown_button); + mCountdownButton.setOnClickListener(this); + mCountdownEntry.setOnEditorActionListener(this); + + updateClockBar(); + hidePopups(); + + } + + private void updateClockBar() { + if (mCommunicationService == null) { + return; + } + mClockBar_clockButton.setChecked(!mTimerOn); + + mCountdownBar.setY(mClockBar.getHeight()); + mStopwatchBar.setY(mClockBar.getHeight()); + + boolean aIsCountdown = mCommunicationService.getSlideShow() + .getTimer().isCountdown(); + // Stopwatch + boolean aStopwatchMode = mTimerOn && !aIsCountdown; + mClockBar_stopwatchButton.setChecked(aStopwatchMode); + mStopwatchBar.setVisibility(aStopwatchMode ? View.VISIBLE + : View.INVISIBLE); + mStopwatchBar.bringToFront(); + if (aStopwatchMode) { + Timer aTimer = mCommunicationService.getSlideShow().getTimer(); + if (aTimer.isRunning()) { + mStopwatchButtonRun.setText(R.string.clock_timer_pause); + mStopwatchButtonReset.setText(R.string.clock_timer_restart); + } else { + mStopwatchButtonRun.setText(R.string.clock_timer_start); + mStopwatchButtonReset.setText(R.string.clock_timer_reset); + } + } + + // Countdown + boolean aCountdownMode = mTimerOn && aIsCountdown; + mClockBar_countdownButton.setChecked(mTimerOn && aIsCountdown); + mCountdownBar.setVisibility(mTimerOn && aIsCountdown ? View.VISIBLE + : View.INVISIBLE); + mCountdownBar.bringToFront(); + if (aCountdownMode) { + Timer aTimer = mCommunicationService.getSlideShow().getTimer(); + if (aTimer.isRunning()) { + mCountdownButton.setText(R.string.clock_timer_pause); + } else { + mCountdownButton.setText(R.string.clock_timer_resume); + } + } + + } + + private Thread timerUpdateThread = new Thread() { + + @Override + public void run() { + //invalidateOptionsMenu(); + CharSequence aTimeString; + long aTime = mCommunicationService.getSlideShow().getTimer() + .getTimeMillis(); + if (mTimerOn) { + aTimeString = DateFormat.format(aTimerFormat, aTime); + } else { + aTimeString = DateFormat.format(aTimeFormat, + System.currentTimeMillis()); + } + mTimeLabel.setText(aTimeString); + // TODO: set the string + timerHandler.postDelayed(this, 50); + + } + + }; + + @Override + public void onClick(View aSource) { + Timer aTimer = mCommunicationService.getSlideShow().getTimer(); + // --------------------------------- ACTIONBAR BUTTONS ------------- + if (aSource == mThumbnailButton) { + if (!mThumbnailFragment.isVisible()) { + FragmentTransaction ft = getFragmentManager() + .beginTransaction(); + ft.replace(R.id.presentation_innerFrame, mThumbnailFragment); + ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); + ft.addToBackStack(null); + ft.commit(); + } else { + getFragmentManager().popBackStack(); + } + } else if (aSource == mTimeLabel) { + if (mClockBar.getVisibility() == View.VISIBLE) { + hidePopups(); + } else { + mClockBar.setVisibility(View.VISIBLE); + updateClockBar(); + mClockBar.bringToFront(); + } + } + // ------------------------------------ CLOCKBAR BUTTONS ----------- + else if (aSource == mClockBar_clockButton) { + mTimerOn = false; + updateClockBar(); + } else if (aSource == mClockBar_stopwatchButton) { + mTimerOn = true; + if (aTimer.isCountdown()) { // Changing mode. + aTimer.reset(); + } + aTimer.setCountdown(false); + updateClockBar(); + } else if (aSource == mClockBar_countdownButton) { + mTimerOn = true; + if (!aTimer.isCountdown()) { // Changing mode + aTimer.reset(); + } + aTimer.setCountdown(true); + updateClockBar(); + } + // ------------------------------------- TIMER BUTTONS + else if (aSource == mStopwatchButtonRun) { + if (aTimer.isRunning()) { + aTimer.stopTimer(); + } else { + aTimer.startTimer(); + } + updateClockBar(); + } else if (aSource == mStopwatchButtonReset) { + if (aTimer.isRunning()) { + aTimer.reset(); + aTimer.startTimer(); + } else { + aTimer.reset(); + } + updateClockBar(); + } else if (aSource == mCountdownButton) { + if (aTimer.isRunning()) { + aTimer.stopTimer(); + } else { + aTimer.startTimer(); + } + updateClockBar(); + } + + } + + @Override + public void onBackStackChanged() { + if (getFragmentManager().getBackStackEntryCount() == 0) { + mThumbnailButton.setChecked(false); + } + } + + @Override + public boolean onEditorAction(TextView tv, int aID, KeyEvent aEvent) { + if (aEvent.getKeyCode() == KeyEvent.KEYCODE_ENTER) { + + long aTime = 0; + try { + SimpleDateFormat aFormat = new SimpleDateFormat("HH:mm:ss"); + aFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + aTime = aFormat.parse(mCountdownEntry.getText().toString()) + .getTime(); + } catch (ParseException e) { + } + if (aTime == 0) { + try { + SimpleDateFormat aFormat = new SimpleDateFormat("mm:ss"); + aFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + aTime = aFormat.parse( + mCountdownEntry.getText().toString()) + .getTime(); + } catch (ParseException e) { + } + } + mCommunicationService.getSlideShow().getTimer() + .setCountdownTime(aTime); + return true; + } + return false; + } + } + + /** + * Intermediate layout that catches all touches, used in order to hide + * the clock menu as appropriate. + * @author andy + * + */ + private class InterceptorLayout extends FrameLayout { + + public InterceptorLayout(Context context) { + super(context); + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent aEvent) { + mActionBarManager.hidePopups(); + return super.onInterceptTouchEvent(aEvent); + } + + @Override + public boolean onTouchEvent(MotionEvent aEvent) { + return super.onTouchEvent(aEvent); + } + + } } diff --git a/android/sdremote/src/org/libreoffice/impressremote/PresentationFragment.java b/android/sdremote/src/org/libreoffice/impressremote/PresentationFragment.java index 9f8d49aad71a..1f9d3ddefb74 100644 --- a/android/sdremote/src/org/libreoffice/impressremote/PresentationFragment.java +++ b/android/sdremote/src/org/libreoffice/impressremote/PresentationFragment.java @@ -6,7 +6,10 @@ import org.libreoffice.impressremote.communication.SlideShow; import pl.polidea.coverflow.AbstractCoverFlowImageAdapter; import pl.polidea.coverflow.CoverFlow; import android.app.Fragment; +import android.content.BroadcastReceiver; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.content.res.Configuration; import android.graphics.Bitmap; import android.graphics.Canvas; @@ -14,7 +17,7 @@ import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; import android.os.Bundle; -import android.os.Message; +import android.support.v4.content.LocalBroadcastManager; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; @@ -47,8 +50,8 @@ public class PresentationFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - mContext = container.getContext(); - + mContext = getActivity().getApplicationContext(); + container.removeAllViews(); View v = inflater.inflate(R.layout.fragment_presentation, container, false); @@ -85,9 +88,26 @@ public class PresentationFragment extends Fragment { // We need to update the view now aAdapter.notifyDataSetChanged(); } + + IntentFilter aFilter = new IntentFilter( + CommunicationService.MSG_SLIDE_CHANGED); + aFilter.addAction(CommunicationService.MSG_SLIDE_NOTES); + aFilter.addAction(CommunicationService.MSG_SLIDE_PREVIEW); + LocalBroadcastManager + .getInstance(getActivity().getApplicationContext()) + .registerReceiver(mListener, aFilter); return v; } + @Override + public void onDestroyView() { + super.onDestroyView(); + LocalBroadcastManager + .getInstance(getActivity().getApplicationContext()) + .unregisterReceiver(mListener); + + } + private void updateSlideNumberDisplay() { int aSlide = mSlideShow.getCurrentSlide(); mNumberText.setText((aSlide + 1) + "/" + mSlideShow.getSize()); @@ -204,23 +224,28 @@ public class PresentationFragment extends Fragment { updateSlideNumberDisplay(); } - public void handleMessage(Message aMessage) { - Bundle aData = aMessage.getData(); - switch (aMessage.what) { - case CommunicationService.MSG_SLIDE_CHANGED: - int aSlide = aData.getInt("slide_number"); - mTopView.setSelection(aSlide, true); - updateSlideNumberDisplay(); - break; - case CommunicationService.MSG_SLIDE_PREVIEW: - int aNSlide = aData.getInt("slide_number"); - if (mTopView.getSelectedItemPosition() == aNSlide) { - // mTopView. // TODO: update the current item + private BroadcastReceiver mListener = new BroadcastReceiver() { + + @Override + public void onReceive(Context aContext, Intent aIntent) { + if (aIntent.getAction().equals( + CommunicationService.MSG_SLIDE_CHANGED)) { + int aSlide = aIntent.getExtras().getInt("slide_number"); + mTopView.setSelection(aSlide, true); + updateSlideNumberDisplay(); + } else if (aIntent.getAction().equals( + CommunicationService.MSG_SLIDE_PREVIEW)) { + int aNSlide = aIntent.getExtras().getInt("slide_number"); + if (mTopView.getSelectedItemPosition() == aNSlide) { + mTopView.setSelection(aNSlide); + } + } else if (aIntent.getAction().equals( + CommunicationService.MSG_SLIDE_NOTES)) { + // TODO: update me } - break; } - } + }; // ------------------------------------------------- THUMBNAIL ADAPTER ---- protected class ThumbnailAdapter extends AbstractCoverFlowImageAdapter { diff --git a/android/sdremote/src/org/libreoffice/impressremote/SelectorActivity.java b/android/sdremote/src/org/libreoffice/impressremote/SelectorActivity.java index a07896ffabec..f6641ed81022 100644 --- a/android/sdremote/src/org/libreoffice/impressremote/SelectorActivity.java +++ b/android/sdremote/src/org/libreoffice/impressremote/SelectorActivity.java @@ -62,6 +62,12 @@ public class SelectorActivity extends Activity { } @Override + protected void onDestroy() { + super.onDestroy(); + LocalBroadcastManager.getInstance(this).unregisterReceiver(mListener); + } + + @Override public void onBackPressed() { mCommunicationService.stopFindingServers(); Intent aIntent = new Intent(this, CommunicationService.class); diff --git a/android/sdremote/src/org/libreoffice/impressremote/StartPresentationActivity.java b/android/sdremote/src/org/libreoffice/impressremote/StartPresentationActivity.java new file mode 100644 index 000000000000..6868d933db55 --- /dev/null +++ b/android/sdremote/src/org/libreoffice/impressremote/StartPresentationActivity.java @@ -0,0 +1,91 @@ +package org.libreoffice.impressremote; + +import org.libreoffice.impressremote.communication.CommunicationService; + +import android.app.Activity; +import android.content.BroadcastReceiver; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.ServiceConnection; +import android.os.Bundle; +import android.os.IBinder; +import android.support.v4.content.LocalBroadcastManager; +import android.view.View; +import android.view.View.OnClickListener; + +public class StartPresentationActivity extends Activity { + private CommunicationService mCommunicationService = null; + private boolean mIsBound = false; + + /** Called when the activity is first created. */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_startpresentation); + bindService(new Intent(this, CommunicationService.class), mConnection, + Context.BIND_IMPORTANT); + mIsBound = true; + + IntentFilter aFilter = new IntentFilter( + CommunicationService.MSG_SLIDESHOW_STARTED); + LocalBroadcastManager.getInstance(this).registerReceiver(mListener, + aFilter); + + findViewById(R.id.startpresentation_button).setOnClickListener( + mClickListener); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + LocalBroadcastManager.getInstance(this).unregisterReceiver(mListener); + } + + private ServiceConnection mConnection = new ServiceConnection() { + @Override + public void onServiceConnected(ComponentName aClassName, + IBinder aService) { + + mCommunicationService = ((CommunicationService.CBinder) aService) + .getService(); + + if (mCommunicationService.isSlideShowRunning()) { + Intent nIntent = new Intent(StartPresentationActivity.this, + PresentationActivity.class); + startActivity(nIntent); + } + + } + + @Override + public void onServiceDisconnected(ComponentName aClassName) { + mCommunicationService = null; + } + }; + + private OnClickListener mClickListener = new OnClickListener() { + + @Override + public void onClick(View v) { + if (mCommunicationService != null) { + mCommunicationService.getTransmitter().startPresentation(); + } + } + }; + + private BroadcastReceiver mListener = new BroadcastReceiver() { + + @Override + public void onReceive(Context aContext, Intent aIntent) { + if (aIntent.getAction().equals( + CommunicationService.MSG_SLIDESHOW_STARTED)) { + Intent nIntent = new Intent(StartPresentationActivity.this, + PresentationActivity.class); + startActivity(nIntent); + } + + } + }; +} diff --git a/android/sdremote/src/org/libreoffice/impressremote/ThumbnailFragment.java b/android/sdremote/src/org/libreoffice/impressremote/ThumbnailFragment.java index 1de6c01feaea..4dbcafffc261 100644 --- a/android/sdremote/src/org/libreoffice/impressremote/ThumbnailFragment.java +++ b/android/sdremote/src/org/libreoffice/impressremote/ThumbnailFragment.java @@ -12,11 +12,14 @@ import org.libreoffice.impressremote.communication.CommunicationService; import org.libreoffice.impressremote.communication.SlideShow; import android.app.Fragment; +import android.content.BroadcastReceiver; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.graphics.Bitmap; import android.graphics.Typeface; import android.os.Bundle; -import android.os.Message; +import android.support.v4.content.LocalBroadcastManager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -29,194 +32,204 @@ import android.widget.TextView; public class ThumbnailFragment extends Fragment { - private CommunicationService mCommunicationService; - - private GridView mGrid; - private ImageView mCurrentImage; - private TextView mCurrentText; - - private SlideShow mSlideShow; - private Context mContext; - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - // Inflate the layout for this fragment - View v = inflater - .inflate(R.layout.fragment_thumbnail, container, false); - - mGrid = (GridView) v.findViewById(R.id.thumbnail_grid); - - mGrid.setOnItemClickListener(new ClickListener()); - mContext = container.getContext(); - - if (mCommunicationService != null && mSlideShow != null) { - mGrid.setAdapter(new ThumbnailAdapter(mContext, mSlideShow)); - } - - return v; - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - mGrid = null; - mContext = null; - mCurrentImage = null; - mCurrentText = null; - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - } - - @Override - public void onPause() { - super.onPause(); - } - - private void setSelected(int position) { - formatUnselected(mCurrentImage, mCurrentText); - - if (mGrid == null) { - return; - } - - View aV = mGrid.getChildAt(position); - if (aV != null) { - mCurrentImage = (ImageView) aV.findViewById(R.id.sub_thumbnail); - mCurrentText = (TextView) aV.findViewById(R.id.sub_number); - - formatSelected(mCurrentImage, mCurrentText); - } - } - - private void formatUnselected(ImageView aImage, TextView aText) { - if (aImage != null) { - aImage.setBackgroundColor(getResources().getColor( - R.color.thumbnail_border)); - } - if (aText != null) { - aText.setTypeface(Typeface.create(aText.getTypeface(), - Typeface.NORMAL)); - } - } - - private void formatSelected(ImageView aImage, TextView aText) { - if (aImage != null) { - aImage.setBackgroundColor(getResources().getColor( - R.color.thumbnail_border_selected)); - } - if (aText != null) { - aText.setTypeface(Typeface.create(aText.getTypeface(), - Typeface.BOLD)); - } - } - - // ----------------------------------------------------- CLICK LISTENER ---- - protected class ClickListener implements AdapterView.OnItemClickListener { - public void onItemClick(AdapterView<?> parent, View v, int position, - long id) { - if (mCommunicationService != null) - mCommunicationService.getTransmitter().gotoSlide(position); - } - } - - // ---------------------------------------------------- MESSAGE HANDLER ---- - - public void setCommunicationService( - CommunicationService aCommunicationService) { - mCommunicationService = aCommunicationService; - mSlideShow = mCommunicationService.getSlideShow(); - if (mGrid != null) { - mGrid.setAdapter(new ThumbnailAdapter(mContext, mSlideShow)); - } - } - - public void handleMessage(Message aMessage) { - if (!isVisible()) { - return; - } - - Bundle aData = aMessage.getData(); - switch (aMessage.what) { - case CommunicationService.MSG_SLIDE_CHANGED: - int aSlide = aData.getInt("slide_number"); - break; - case CommunicationService.MSG_SLIDE_PREVIEW: - mGrid.invalidateViews(); - break; - - } - } - - // ------------------------------------------------- THUMBNAIL ADAPTER ---- - protected class ThumbnailAdapter extends BaseAdapter { - - private Context mContext; - - private SlideShow mSlideShow; - - public ThumbnailAdapter(Context aContext, SlideShow aSlideShow) { - mContext = aContext; - mSlideShow = aSlideShow; - } - - @Override - public int getCount() { - return mSlideShow.getSize(); - } - - @Override - public Object getItem(int arg0) { - return null; - } - - @Override - public long getItemId(int position) { - return 0; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - LayoutInflater aInflater = (LayoutInflater) mContext - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - View v = aInflater.inflate(R.layout.slide_thumbnail, null); - - ImageView aImage = (ImageView) v.findViewById(R.id.sub_thumbnail); - TextView aText = (TextView) v.findViewById(R.id.sub_number); - - // Do the image & number styling - int aBorderWidth = getResources().getInteger( - R.integer.thumbnail_border_width); - aImage.setPadding(aBorderWidth, aBorderWidth, aBorderWidth, - aBorderWidth); - - if ((mSlideShow != null) - && (position == mSlideShow.getCurrentSlide())) { - formatSelected(aImage, aText); - mCurrentImage = aImage; - mCurrentText = aText; - } else { - formatUnselected(aImage, aText); - } - - Bitmap aBitmap = mSlideShow.getImage(position); - // Width - int aWidth = (mGrid.getWidth()) / 3 - 20; - aImage.setMaxWidth(aWidth); - aImage.setScaleType(ScaleType.FIT_CENTER); - - if (aBitmap != null) { - aImage.setImageBitmap(aBitmap); - } - - aText.setText(String.valueOf(position + 1)); - - return v; - } - } + private CommunicationService mCommunicationService; + + private GridView mGrid; + private ImageView mCurrentImage; + private TextView mCurrentText; + + private SlideShow mSlideShow; + private Context mContext; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + container.removeAllViews(); + View v = inflater + .inflate(R.layout.fragment_thumbnail, container, false); + + mGrid = (GridView) v.findViewById(R.id.thumbnail_grid); + + mGrid.setOnItemClickListener(new ClickListener()); + mContext = getActivity().getApplicationContext(); + + if (mCommunicationService != null && mSlideShow != null) { + mGrid.setAdapter(new ThumbnailAdapter(mContext, mSlideShow)); + } + + IntentFilter aFilter = new IntentFilter( + CommunicationService.MSG_SLIDE_CHANGED); + aFilter.addAction(CommunicationService.MSG_SLIDE_PREVIEW); + LocalBroadcastManager + .getInstance(getActivity().getApplicationContext()) + .registerReceiver(mListener, aFilter); + + return v; + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + LocalBroadcastManager + .getInstance(getActivity().getApplicationContext()) + .unregisterReceiver(mListener); + mGrid = null; + mContext = null; + mCurrentImage = null; + mCurrentText = null; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + } + + @Override + public void onPause() { + super.onPause(); + } + + private void setSelected(int position) { + formatUnselected(mCurrentImage, mCurrentText); + + if (mGrid == null) { + return; + } + + View aV = mGrid.getChildAt(position); + if (aV != null) { + mCurrentImage = (ImageView) aV.findViewById(R.id.sub_thumbnail); + mCurrentText = (TextView) aV.findViewById(R.id.sub_number); + + formatSelected(mCurrentImage, mCurrentText); + } + } + + private void formatUnselected(ImageView aImage, TextView aText) { + if (aImage != null) { + aImage.setBackgroundColor(getResources().getColor( + R.color.thumbnail_border)); + } + if (aText != null) { + aText.setTypeface(Typeface.create(aText.getTypeface(), + Typeface.NORMAL)); + } + } + + private void formatSelected(ImageView aImage, TextView aText) { + if (aImage != null) { + aImage.setBackgroundColor(getResources().getColor( + R.color.thumbnail_border_selected)); + } + if (aText != null) { + aText.setTypeface(Typeface.create(aText.getTypeface(), + Typeface.BOLD)); + } + } + + // ----------------------------------------------------- CLICK LISTENER ---- + protected class ClickListener implements AdapterView.OnItemClickListener { + public void onItemClick(AdapterView<?> parent, View v, int position, + long id) { + if (mCommunicationService != null) + mCommunicationService.getTransmitter().gotoSlide(position); + } + } + + // ---------------------------------------------------- MESSAGE HANDLER ---- + + public void setCommunicationService( + CommunicationService aCommunicationService) { + mCommunicationService = aCommunicationService; + mSlideShow = mCommunicationService.getSlideShow(); + if (mGrid != null) { + mGrid.setAdapter(new ThumbnailAdapter(mContext, mSlideShow)); + } + } + + private BroadcastReceiver mListener = new BroadcastReceiver() { + + @Override + public void onReceive(Context aContext, Intent aIntent) { + if (aIntent.getAction().equals( + CommunicationService.MSG_SLIDE_CHANGED)) { + int aSlide = aIntent.getExtras().getInt("slide_number"); + setSelected(aSlide); + } else if (aIntent.getAction().equals( + CommunicationService.MSG_SLIDE_PREVIEW)) { + mGrid.invalidateViews(); + } + + } + }; + + // ------------------------------------------------- THUMBNAIL ADAPTER ---- + protected class ThumbnailAdapter extends BaseAdapter { + + private Context mContext; + + private SlideShow mSlideShow; + + public ThumbnailAdapter(Context aContext, SlideShow aSlideShow) { + mContext = aContext; + mSlideShow = aSlideShow; + } + + @Override + public int getCount() { + return mSlideShow.getSize(); + } + + @Override + public Object getItem(int arg0) { + return null; + } + + @Override + public long getItemId(int position) { + return 0; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + LayoutInflater aInflater = (LayoutInflater) mContext + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + View v = aInflater.inflate(R.layout.slide_thumbnail, null); + + ImageView aImage = (ImageView) v.findViewById(R.id.sub_thumbnail); + TextView aText = (TextView) v.findViewById(R.id.sub_number); + + // Do the image & number styling + int aBorderWidth = getResources().getInteger( + R.integer.thumbnail_border_width); + aImage.setPadding(aBorderWidth, aBorderWidth, aBorderWidth, + aBorderWidth); + + if ((mSlideShow != null) + && (position == mSlideShow.getCurrentSlide())) { + formatSelected(aImage, aText); + mCurrentImage = aImage; + mCurrentText = aText; + } else { + formatUnselected(aImage, aText); + } + + Bitmap aBitmap = mSlideShow.getImage(position); + // Width + int aWidth = (mGrid.getWidth()) / 3 - 20; + aImage.setMaxWidth(aWidth); + aImage.setScaleType(ScaleType.FIT_CENTER); + + if (aBitmap != null) { + aImage.setImageBitmap(aBitmap); + } + + aText.setText(String.valueOf(position + 1)); + + return v; + } + } } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
\ No newline at end of file diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/Client.java b/android/sdremote/src/org/libreoffice/impressremote/communication/Client.java index 044d38a4ec2e..81c889333e29 100644 --- a/android/sdremote/src/org/libreoffice/impressremote/communication/Client.java +++ b/android/sdremote/src/org/libreoffice/impressremote/communication/Client.java @@ -34,6 +34,8 @@ public abstract class Client { protected OutputStream mOutputStream; protected String mPin = ""; + private static Client latestInstance = null; + public abstract void closeConnection(); private Receiver mReceiver; @@ -42,6 +44,7 @@ public abstract class Client { public Client(Context aContext) { mContext = aContext; + latestInstance = this; } public void setReceiver(Receiver aReceiver) { @@ -77,11 +80,16 @@ public abstract class Client { // TODO stream couldn't be opened. e1.printStackTrace(); } + latestInstance = null; } - public String getPin() { - return mPin; + public static String getPin() { + if (latestInstance != null) { + return latestInstance.mPin; + } else { + return ""; + } } /** diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java b/android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java index 75634949e9dc..677028c5cdff 100644 --- a/android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java +++ b/android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java @@ -12,7 +12,6 @@ import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; -import android.os.Messenger; public class CommunicationService extends Service implements Runnable { @@ -32,10 +31,7 @@ public class CommunicationService extends Service implements Runnable { } public String getPairingPin() { - if (mClient != null) - return mClient.getPin(); - else - return ""; + return Client.getPin(); } public String getDeviceName() { @@ -67,6 +63,7 @@ public class CommunicationService extends Service implements Runnable { mState = State.DISCONNECTED; } if (mStateDesired == State.CONNECTED) { + mState = State.CONNECTING; switch (mServerDesired.getProtocol()) { case NETWORK: mClient = new NetworkClient( @@ -138,10 +135,10 @@ public class CommunicationService extends Service implements Runnable { private final IBinder mBinder = new CBinder(); - public static final int MSG_SLIDESHOW_STARTED = 1; - public static final int MSG_SLIDE_CHANGED = 2; - public static final int MSG_SLIDE_PREVIEW = 3; - public static final int MSG_SLIDE_NOTES = 4; + public static final String MSG_SLIDESHOW_STARTED = "SLIDESHOW_STARTED"; + public static final String MSG_SLIDE_CHANGED = "SLIDE_CHANGED"; + public static final String MSG_SLIDE_PREVIEW = "SLIDE_PREVIEW"; + public static final String MSG_SLIDE_NOTES = "SLIDE_NOTES"; public static final String MSG_SERVERLIST_CHANGED = "SERVERLIST_CHANGED"; public static final String MSG_PAIRING_STARTED = "PAIRING_STARTED"; @@ -151,14 +148,10 @@ public class CommunicationService extends Service implements Runnable { private Client mClient; - private Receiver mReceiver = new Receiver(); + private Receiver mReceiver = new Receiver(this); private ServerFinder mFinder = new ServerFinder(this); - public void setActivityMessenger(Messenger aActivityMessenger) { - mReceiver.setActivityMessenger(aActivityMessenger); - } - @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub @@ -201,5 +194,9 @@ public class CommunicationService extends Service implements Runnable { return mReceiver.getSlideShow(); } + public boolean isSlideShowRunning() { + return mReceiver.isSlideShowRunning(); + } + } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
\ No newline at end of file diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/Receiver.java b/android/sdremote/src/org/libreoffice/impressremote/communication/Receiver.java index 1cecd49a0000..a3fe70e40791 100644 --- a/android/sdremote/src/org/libreoffice/impressremote/communication/Receiver.java +++ b/android/sdremote/src/org/libreoffice/impressremote/communication/Receiver.java @@ -10,112 +10,87 @@ package org.libreoffice.impressremote.communication; import java.util.ArrayList; -import android.os.Bundle; -import android.os.Message; -import android.os.Messenger; -import android.os.RemoteException; +import android.content.Context; +import android.content.Intent; +import android.support.v4.content.LocalBroadcastManager; import android.util.Base64; public class Receiver { - private Messenger mActivityMessenger; - - private SlideShow mSlideShow = new SlideShow(); - - public SlideShow getSlideShow() { - return mSlideShow; - } - - public void setActivityMessenger(Messenger aActivityMessenger) { - mActivityMessenger = aActivityMessenger; - } - - public void parseCommand(ArrayList<String> aCommand) { - if (mActivityMessenger == null) { - return; - } - String aInstruction = aCommand.get(0); - if (aInstruction.equals("slideshow_started")) { - int aSlideShowlength = Integer.parseInt(aCommand.get(1)); - int aCurrentSlide = Integer.parseInt(aCommand.get(2)); - mSlideShow.setLength(aSlideShowlength); - mSlideShow.setCurrentSlide(aCurrentSlide); - - Message aMessage = Message.obtain(null, - CommunicationService.MSG_SLIDESHOW_STARTED); - Bundle aData = new Bundle(); - aMessage.setData(aData); - try { - mActivityMessenger.send(aMessage); - } catch (RemoteException e) { - // Dead Handler -- i.e. Activity gone. - } - } else { - if (mSlideShow == null) - return; - - if (aInstruction.equals("slide_updated")) { - - int aSlideNumber = Integer.parseInt(aCommand.get(1)); - - mSlideShow.setCurrentSlide(aSlideNumber); - - Message aMessage = Message.obtain(null, - CommunicationService.MSG_SLIDE_CHANGED); - Bundle aData = new Bundle(); - aData.putInt("slide_number", aSlideNumber); - aMessage.setData(aData); - try { - mActivityMessenger.send(aMessage); - } catch (RemoteException e) { - // Dead Handler -- i.e. Activity gone. - } - } else if (aInstruction.equals("slide_preview")) { - int aSlideNumber = Integer.parseInt(aCommand.get(1)); - String aImageString = aCommand.get(2); - byte[] aImage = Base64.decode(aImageString, Base64.DEFAULT); - - // Store image internally - mSlideShow.putImage(aSlideNumber, aImage); - - // Notify the frontend - Message aMessage = Message.obtain(null, - CommunicationService.MSG_SLIDE_PREVIEW); - Bundle aData = new Bundle(); - aData.putInt("slide_number", aSlideNumber); - aMessage.setData(aData); - try { - mActivityMessenger.send(aMessage); - } catch (RemoteException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } else if (aInstruction.equals("slide_notes")) { - int aSlideNumber = Integer.parseInt(aCommand.get(1)); - String aNotes = new String(); - for (int i = 2; i < aCommand.size(); i++) { - aNotes += aCommand.get(i); - } - - // Store image internally - mSlideShow.putNotes(aSlideNumber, aNotes); - - // Notify the frontend - Message aMessage = Message.obtain(null, - CommunicationService.MSG_SLIDE_NOTES); - Bundle aData = new Bundle(); - aData.putInt("slide_number", aSlideNumber); - aMessage.setData(aData); - try { - mActivityMessenger.send(aMessage); - } catch (RemoteException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - - } - - } + public Receiver(Context aContext) { + mContext = aContext; + mSlideShow = new SlideShow(mContext); + } + + private Context mContext; + + private SlideShow mSlideShow; + + public SlideShow getSlideShow() { + return mSlideShow; + } + + public boolean isSlideShowRunning() { + return (mSlideShow.getSize() > 0); + } + + public void parseCommand(ArrayList<String> aCommand) { + String aInstruction = aCommand.get(0); + if (aInstruction.equals("slideshow_started")) { + int aSlideShowlength = Integer.parseInt(aCommand.get(1)); + int aCurrentSlide = Integer.parseInt(aCommand.get(2)); + mSlideShow.setLength(aSlideShowlength); + mSlideShow.setCurrentSlide(aCurrentSlide); + Intent aIntent = new Intent( + CommunicationService.MSG_SLIDESHOW_STARTED); + LocalBroadcastManager.getInstance(mContext).sendBroadcast(aIntent); + } else { + if (mSlideShow == null) + return; + + if (aInstruction.equals("slide_updated")) { + + int aSlideNumber = Integer.parseInt(aCommand.get(1)); + + mSlideShow.setCurrentSlide(aSlideNumber); + + Intent aIntent = new Intent( + CommunicationService.MSG_SLIDE_CHANGED); + aIntent.putExtra("slide_number", aSlideNumber); + LocalBroadcastManager.getInstance(mContext).sendBroadcast( + aIntent); + } else if (aInstruction.equals("slide_preview")) { + int aSlideNumber = Integer.parseInt(aCommand.get(1)); + String aImageString = aCommand.get(2); + byte[] aImage = Base64.decode(aImageString, Base64.DEFAULT); + + // Store image internally + mSlideShow.putImage(aSlideNumber, aImage); + + Intent aIntent = new Intent( + CommunicationService.MSG_SLIDE_PREVIEW); + aIntent.putExtra("slide_number", aSlideNumber); + LocalBroadcastManager.getInstance(mContext).sendBroadcast( + aIntent); + } else if (aInstruction.equals("slide_notes")) { + int aSlideNumber = Integer.parseInt(aCommand.get(1)); + String aNotes = new String(); + for (int i = 2; i < aCommand.size(); i++) { + aNotes += aCommand.get(i); + } + + // Store image internally + mSlideShow.putNotes(aSlideNumber, aNotes); + + Intent aIntent = new Intent( + CommunicationService.MSG_SLIDE_NOTES); + aIntent.putExtra("slide_number", aSlideNumber); + LocalBroadcastManager.getInstance(mContext).sendBroadcast( + aIntent); + } + + } + + } } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
\ No newline at end of file diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/SlideShow.java b/android/sdremote/src/org/libreoffice/impressremote/communication/SlideShow.java index 74f9ba958305..cba18cd2d213 100644 --- a/android/sdremote/src/org/libreoffice/impressremote/communication/SlideShow.java +++ b/android/sdremote/src/org/libreoffice/impressremote/communication/SlideShow.java @@ -8,160 +8,169 @@ */ package org.libreoffice.impressremote.communication; +import org.libreoffice.impressremote.R; + +import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.util.SparseArray; public class SlideShow { - private SparseArray<byte[]> mPreviewImages = new SparseArray<byte[]>(); - private SparseArray<String> mNotes = new SparseArray<String>(); - - private int mSize = 0; - private int mCurrentSlide = 0; - - protected SlideShow() { - } - - protected void setLength(int aSize) { - mSize = aSize; - } - - public int getSize() { - return mSize; - } - - public int getCurrentSlide() { - return mCurrentSlide; - } - - protected void setCurrentSlide(int aSlide) { - mCurrentSlide = aSlide; - } - - protected void putImage(int aSlide, byte[] aImage) { - mPreviewImages.put(aSlide, aImage); - } - - public Bitmap getImage(int aSlide) { - byte[] aImage = mPreviewImages.get(aSlide); - return BitmapFactory.decodeByteArray(aImage, 0, aImage.length); - } - - protected void putNotes(int aSlide, String aNotes) { - mNotes.put(aSlide, aNotes); - } - - public String getNotes(int aSlide) { - return mNotes.get(aSlide); - } - - // ---------------------------------------------------- TIMER -------------- - private Timer mTimer = new Timer(); - - public Timer getTimer() { - return mTimer; - } - - public class Timer { - /** - * This stores the starting time of the timer if running. - * - * If paused this stores how long the timer was previously running. - */ - private long aTime = 0; - - private long mCountdownTime = 0; - - private boolean mIsRunning = false; - - private boolean mIsCountdown = false; - - /** - * Set whether this timer should be a normal or a countdown timer. - * @param aIsCountdown - * Whether this should be a countdown timer. - */ - public void setCountdown(boolean aIsCountdown) { - mIsCountdown = aIsCountdown; - if (mIsRunning) { - mIsRunning = false; - aTime = 0; - } - } - - /** - * Set the countdown time. Can be set, and isn't lost, whatever mode - * the timer is running in. - * @param aCountdownTime - * The countdown time. - */ - public void setCountdownTime(long aCountdownTime) { - mCountdownTime = aCountdownTime; - } - - public long getCountdownTime() { - return mCountdownTime; - } - - public boolean isCountdown() { - return mIsCountdown; - } - - public boolean isRunning() { - return mIsRunning; - } - - /** - * Reset the timer, and stop it it was running. - */ - public void reset() { - mIsRunning = false; - aTime = 0; - } - - public void startTimer() { - if (mIsRunning) - return; - - aTime = System.currentTimeMillis() - aTime; - mIsRunning = true; - } - - public void stopTimer() { - if (!mIsRunning) - return; - - aTime = System.currentTimeMillis() - aTime; - mIsRunning = false; - } - - /** - * Get either how long this timer has been running, or how long the - * timer still has left to run. - * @return - */ - public long getTimeMillis() { - long aTimeRunning; - // Determine how long we've been going. - if (mIsRunning) { - aTimeRunning = System.currentTimeMillis() - aTime; - } else { - aTimeRunning = aTime; - } - // And give the time going, or time left - if (!mIsCountdown) { - return aTimeRunning; - } else { - long aRet = mCountdownTime - aTimeRunning; - if (aRet < 0) { // We have completed! - mIsRunning = false; - aRet = 0; - } - return aRet; - } - - } - } + private SparseArray<byte[]> mPreviewImages = new SparseArray<byte[]>(); + private SparseArray<String> mNotes = new SparseArray<String>(); + + private int mSize = 0; + private int mCurrentSlide = 0; + private Context mContext; + + protected SlideShow(Context aContext) { + mContext = aContext; + } + + protected void setLength(int aSize) { + mSize = aSize; + } + + public int getSize() { + return mSize; + } + + public int getCurrentSlide() { + return mCurrentSlide; + } + + protected void setCurrentSlide(int aSlide) { + mCurrentSlide = aSlide; + } + + protected void putImage(int aSlide, byte[] aImage) { + mPreviewImages.put(aSlide, aImage); + } + + public Bitmap getImage(int aSlide) { + byte[] aImage = mPreviewImages.get(aSlide); + if (aImage == null) { + return BitmapFactory.decodeResource(mContext.getResources(), + R.drawable.image_loading); + } + return BitmapFactory.decodeByteArray(aImage, 0, aImage.length); + } + + protected void putNotes(int aSlide, String aNotes) { + mNotes.put(aSlide, aNotes); + } + + public String getNotes(int aSlide) { + return mNotes.get(aSlide); + } + + // ---------------------------------------------------- TIMER -------------- + private Timer mTimer = new Timer(); + + public Timer getTimer() { + return mTimer; + } + + public class Timer { + /** + * This stores the starting time of the timer if running. + * + * If paused this stores how long the timer was previously running. + */ + private long aTime = 0; + + private long mCountdownTime = 0; + + private boolean mIsRunning = false; + + private boolean mIsCountdown = false; + + /** + * Set whether this timer should be a normal or a countdown timer. + * @param aIsCountdown + * Whether this should be a countdown timer. + */ + public void setCountdown(boolean aIsCountdown) { + mIsCountdown = aIsCountdown; + if (mIsRunning) { + mIsRunning = false; + aTime = 0; + } + } + + /** + * Set the countdown time. Can be set, and isn't lost, whatever mode + * the timer is running in. + * @param aCountdownTime + * The countdown time. + */ + public void setCountdownTime(long aCountdownTime) { + mCountdownTime = aCountdownTime; + } + + public long getCountdownTime() { + return mCountdownTime; + } + + public boolean isCountdown() { + return mIsCountdown; + } + + public boolean isRunning() { + return mIsRunning; + } + + /** + * Reset the timer, and stop it it was running. + */ + public void reset() { + mIsRunning = false; + aTime = 0; + } + + public void startTimer() { + if (mIsRunning) + return; + + aTime = System.currentTimeMillis() - aTime; + mIsRunning = true; + } + + public void stopTimer() { + if (!mIsRunning) + return; + + aTime = System.currentTimeMillis() - aTime; + mIsRunning = false; + } + + /** + * Get either how long this timer has been running, or how long the + * timer still has left to run. + * @return + */ + public long getTimeMillis() { + long aTimeRunning; + // Determine how long we've been going. + if (mIsRunning) { + aTimeRunning = System.currentTimeMillis() - aTime; + } else { + aTimeRunning = aTime; + } + // And give the time going, or time left + if (!mIsCountdown) { + return aTimeRunning; + } else { + long aRet = mCountdownTime - aTimeRunning; + if (aRet < 0) { // We have completed! + mIsRunning = false; + aRet = 0; + } + return aRet; + } + + } + } } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
\ No newline at end of file diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/TestClient.java b/android/sdremote/src/org/libreoffice/impressremote/communication/TestClient.java index 662cb5016724..a63472f32e0b 100644 --- a/android/sdremote/src/org/libreoffice/impressremote/communication/TestClient.java +++ b/android/sdremote/src/org/libreoffice/impressremote/communication/TestClient.java @@ -1,197 +1,197 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -package org.libreoffice.impressremote.communication; - -import org.libreoffice.impressremote.PresentationActivity; -import org.libreoffice.impressremote.R; -import org.libreoffice.impressremote.communication.Server.Protocol; - -import android.app.Activity; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.ServiceConnection; -import android.graphics.Bitmap; -import android.os.Bundle; -import android.os.Handler; -import android.os.IBinder; -import android.os.Message; -import android.os.Messenger; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.Button; -import android.widget.ImageView; -import android.widget.TextView; - -public class TestClient extends Activity { - - private boolean mCurrentPreviewImageMissing = false; - - private boolean mIsBound = false; - - private CommunicationService mCommunicationService; - - final Messenger mMessenger = new Messenger(new MessageHandler()); - - /** Called when the activity is first created. */ - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.testlayout); - setupUI(); - - } - - @Override - protected void onResume() { - super.onResume(); - doBindService(); - - } - - // FIXME: move all necessary code to CommunicationService.onUnbind - - @Override - protected void onPause() { - super.onPause(); - } - - @Override - public void onBackPressed() { - // TODO Auto-generated method stub - mCommunicationService.disconnect(); - stopService(new Intent(this, CommunicationService.class)); - doUnbindService(); - finish(); - super.onBackPressed(); - } - - @Override - protected void onStop() { - // TODO Auto-generated method stub - super.onStop(); - // mCommunicationService.disconnect(); - // stopService(new Intent(this, CommunicationService.class)); - } - - private ServiceConnection mConnection = new ServiceConnection() { - @Override - public void onServiceConnected(ComponentName aClassName, - IBinder aService) { - mCommunicationService = ((CommunicationService.CBinder) aService) - .getService(); - mCommunicationService.connectTo(new Server(Protocol.NETWORK, - "10.0.2.2", "TestServer", 0l)); - mCommunicationService.setActivityMessenger(mMessenger); - enableButtons(true); - } - - @Override - public void onServiceDisconnected(ComponentName aClassName) { - mCommunicationService = null; - enableButtons(false); - } - }; - - void doBindService() { - Intent aIntent = new Intent(this, CommunicationService.class); - startService(aIntent); - bindService(aIntent, mConnection, Context.BIND_IMPORTANT); - mIsBound = true; - } - - void doUnbindService() { - mCommunicationService.setActivityMessenger(null); - if (mIsBound) { - unbindService(mConnection); - mIsBound = false; - } - } - - private Button mButtonNext; - - private Button mButtonPrevious; - - private ImageView mImageView; - - private TextView mSlideLabel; - - private void setupUI() { - mButtonNext = (Button) findViewById(R.id.button_next); - mButtonPrevious = (Button) findViewById(R.id.button_previous); - mImageView = (ImageView) findViewById(R.id.image_preview); - mSlideLabel = (TextView) findViewById(R.id.label_curSlide); - - enableButtons(false); - - mButtonNext.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) { - mCommunicationService.getTransmitter().nextTransition(); - - } - - }); - - mButtonPrevious.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) { - mCommunicationService.getTransmitter().previousTransition(); - - } - - }); - - Button mThumbnailButton = (Button) findViewById(R.id.button_thumbnail); - - mThumbnailButton.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - Intent aIntent = new Intent(TestClient.this, - PresentationActivity.class); - startActivity(aIntent); - } - }); - - } - - private void enableButtons(boolean aEnabled) { - mButtonNext.setEnabled(aEnabled); - mButtonPrevious.setEnabled(aEnabled); - } - - class MessageHandler extends Handler { - @Override - public void handleMessage(Message aMessage) { - Bundle aData = aMessage.getData(); - switch (aMessage.what) { - case CommunicationService.MSG_SLIDE_CHANGED: - int newSlide = aData.getInt("slide_number"); - mSlideLabel.setText("Slide " + newSlide); - mCurrentPreviewImageMissing = true; - // We continue on to try and update the image. - case CommunicationService.MSG_SLIDE_PREVIEW: - int aSlideNumber = aData.getInt("slide_number"); - if (mCurrentPreviewImageMissing) { - Bitmap aImage = mCommunicationService.getSlideShow() - .getImage(aSlideNumber); - if (aImage != null) { - mImageView.setImageBitmap(aImage); - mCurrentPreviewImageMissing = false; - } - } - break; - - } - } - } -} -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
\ No newline at end of file +///* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +///* +// * This file is part of the LibreOffice project. +// * +// * This Source Code Form is subject to the terms of the Mozilla Public +// * License, v. 2.0. If a copy of the MPL was not distributed with this +// * file, You can obtain one at http://mozilla.org/MPL/2.0/. +// */ +//package org.libreoffice.impressremote.communication; +// +//import org.libreoffice.impressremote.PresentationActivity; +//import org.libreoffice.impressremote.R; +//import org.libreoffice.impressremote.communication.Server.Protocol; +// +//import android.app.Activity; +//import android.content.ComponentName; +//import android.content.Context; +//import android.content.Intent; +//import android.content.ServiceConnection; +//import android.graphics.Bitmap; +//import android.os.Bundle; +//import android.os.Handler; +//import android.os.IBinder; +//import android.os.Message; +//import android.os.Messenger; +//import android.view.View; +//import android.view.View.OnClickListener; +//import android.widget.Button; +//import android.widget.ImageView; +//import android.widget.TextView; +// +//public class TestClient extends Activity { +// +// private boolean mCurrentPreviewImageMissing = false; +// +// private boolean mIsBound = false; +// +// private CommunicationService mCommunicationService; +// +// final Messenger mMessenger = new Messenger(new MessageHandler()); +// +// /** Called when the activity is first created. */ +// @Override +// public void onCreate(Bundle savedInstanceState) { +// super.onCreate(savedInstanceState); +// setContentView(R.layout.testlayout); +// setupUI(); +// +// } +// +// @Override +// protected void onResume() { +// super.onResume(); +// doBindService(); +// +// } +// +// // FIXME: move all necessary code to CommunicationService.onUnbind +// +// @Override +// protected void onPause() { +// super.onPause(); +// } +// +// @Override +// public void onBackPressed() { +// // TODO Auto-generated method stub +// mCommunicationService.disconnect(); +// stopService(new Intent(this, CommunicationService.class)); +// doUnbindService(); +// finish(); +// super.onBackPressed(); +// } +// +// @Override +// protected void onStop() { +// // TODO Auto-generated method stub +// super.onStop(); +// // mCommunicationService.disconnect(); +// // stopService(new Intent(this, CommunicationService.class)); +// } +// +// private ServiceConnection mConnection = new ServiceConnection() { +// @Override +// public void onServiceConnected(ComponentName aClassName, +// IBinder aService) { +// mCommunicationService = ((CommunicationService.CBinder) aService) +// .getService(); +// mCommunicationService.connectTo(new Server(Protocol.NETWORK, +// "10.0.2.2", "TestServer", 0l)); +// mCommunicationService.setActivityMessenger(mMessenger); +// enableButtons(true); +// } +// +// @Override +// public void onServiceDisconnected(ComponentName aClassName) { +// mCommunicationService = null; +// enableButtons(false); +// } +// }; +// +// void doBindService() { +// Intent aIntent = new Intent(this, CommunicationService.class); +// startService(aIntent); +// bindService(aIntent, mConnection, Context.BIND_IMPORTANT); +// mIsBound = true; +// } +// +// void doUnbindService() { +// mCommunicationService.setActivityMessenger(null); +// if (mIsBound) { +// unbindService(mConnection); +// mIsBound = false; +// } +// } +// +// private Button mButtonNext; +// +// private Button mButtonPrevious; +// +// private ImageView mImageView; +// +// private TextView mSlideLabel; +// +// private void setupUI() { +// mButtonNext = (Button) findViewById(R.id.button_next); +// mButtonPrevious = (Button) findViewById(R.id.button_previous); +// mImageView = (ImageView) findViewById(R.id.image_preview); +// mSlideLabel = (TextView) findViewById(R.id.label_curSlide); +// +// enableButtons(false); +// +// mButtonNext.setOnClickListener(new OnClickListener() { +// +// @Override +// public void onClick(View v) { +// mCommunicationService.getTransmitter().nextTransition(); +// +// } +// +// }); +// +// mButtonPrevious.setOnClickListener(new OnClickListener() { +// +// @Override +// public void onClick(View v) { +// mCommunicationService.getTransmitter().previousTransition(); +// +// } +// +// }); +// +// Button mThumbnailButton = (Button) findViewById(R.id.button_thumbnail); +// +// mThumbnailButton.setOnClickListener(new OnClickListener() { +// @Override +// public void onClick(View v) { +// Intent aIntent = new Intent(TestClient.this, +// PresentationActivity.class); +// startActivity(aIntent); +// } +// }); +// +// } +// +// private void enableButtons(boolean aEnabled) { +// mButtonNext.setEnabled(aEnabled); +// mButtonPrevious.setEnabled(aEnabled); +// } +// +// class MessageHandler extends Handler { +// @Override +// public void handleMessage(Message aMessage) { +// Bundle aData = aMessage.getData(); +// switch (aMessage.what) { +// case CommunicationService.MSG_SLIDE_CHANGED: +// int newSlide = aData.getInt("slide_number"); +// mSlideLabel.setText("Slide " + newSlide); +// mCurrentPreviewImageMissing = true; +// // We continue on to try and update the image. +// case CommunicationService.MSG_SLIDE_PREVIEW: +// int aSlideNumber = aData.getInt("slide_number"); +// if (mCurrentPreviewImageMissing) { +// Bitmap aImage = mCommunicationService.getSlideShow() +// .getImage(aSlideNumber); +// if (aImage != null) { +// mImageView.setImageBitmap(aImage); +// mCurrentPreviewImageMissing = false; +// } +// } +// break; +// +// } +// } +// } +//} +///* vim:set shiftwidth=4 softtabstop=4 expandtab: */
\ No newline at end of file |