Implemented rotation of slideshow view.

Change-Id: Ib518e1609d21463273a00fcf161f20c80eae6a67
This commit is contained in:
Andrzej J.R. Hunt
2012-08-14 18:27:53 +02:00
parent e02468f6e8
commit 0357b77895
16 changed files with 1137 additions and 1002 deletions

View File

@@ -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" >

Binary file not shown.

After

Width:  |  Height:  |  Size: 287 B

View File

@@ -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"

View File

@@ -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>

View File

@@ -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>

View File

@@ -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);
}
}

View File

@@ -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;
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);
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
bindService(new Intent(this, CommunicationService.class), mConnection,
Context.BIND_IMPORTANT);
mIsBound = true;
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();
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);
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
fragmentTransaction.add(R.id.presentation_innerFrame,
mPresentationFragment, "fragment_presentation");
fragmentTransaction.commit();
}
//((FrameLayout) findViewById(R.id.framelayout)).addView(mLayout);
mThumbnailFragment = new ThumbnailFragment();
mPresentationFragment = new PresentationFragment();
@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) {
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
fragmentTransaction.add(R.id.presentation_innerFrame,
mPresentationFragment, "fragment_presentation");
fragmentTransaction.commit();
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);
@Override
protected void onDestroy() {
mActionBarManager.stop();
super.onDestroy();
}
mPresentationFragment
.setCommunicationService(mCommunicationService);
mThumbnailFragment.setCommunicationService(mCommunicationService);
@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);
}
@Override
public void onServiceDisconnected(ComponentName aClassName) {
mCommunicationService = null;
}
};
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName aClassName,
IBinder aService) {
mCommunicationService = ((CommunicationService.CBinder) aService)
.getService();
final Messenger mMessenger = new Messenger(new MessageHandler());
mPresentationFragment
.setCommunicationService(mCommunicationService);
mThumbnailFragment.setCommunicationService(mCommunicationService);
@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 void onServiceDisconnected(ComponentName aClassName) {
mCommunicationService = null;
}
};
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Intent aIntent;
switch (item.getItemId()) {
case R.id.actionbar_presentation_submenu_options:
// ---------------------------------------------- ACTION BAR ---------------
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.actionbar_presentation, menu);
mActionBarManager = new ActionBarManager();
return true;
}
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) {
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Intent aIntent;
switch (item.getItemId()) {
case R.id.actionbar_presentation_submenu_options:
BlankScreenFragment aFragment = new BlankScreenFragment(
mCommunicationService);
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) {
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);
}
}
BlankScreenFragment aFragment = new BlankScreenFragment(
mCommunicationService);
private class ActionBarManager implements OnClickListener,
FragmentManager.OnBackStackChangedListener,
TextView.OnEditorActionListener {
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 ToggleButton mTimeLabel;
private ToggleButton mThumbnailButton;
private class ActionBarManager implements OnClickListener,
FragmentManager.OnBackStackChangedListener,
TextView.OnEditorActionListener {
private View mDropdownOptions;
private View mDropdownBlank;
private Handler timerHandler = new Handler();
// ------- CLOCKBAR
private View mClockBar;
private ToggleButton mClockBar_clockButton;
private ToggleButton mClockBar_stopwatchButton;
private ToggleButton mClockBar_countdownButton;
private ToggleButton mTimeLabel;
private ToggleButton mThumbnailButton;
// ------- STOPWATCH BAR
private View mStopwatchBar;
private Button mStopwatchButtonRun;
private Button mStopwatchButtonReset;
private View mDropdownOptions;
private View mDropdownBlank;
// ------- COUNTDOWN BAR
private View mCountdownBar;
private EditText mCountdownEntry;
private Button mCountdownButton;
// ------- CLOCKBAR
private View mClockBar;
private ToggleButton mClockBar_clockButton;
private ToggleButton mClockBar_stopwatchButton;
private ToggleButton mClockBar_countdownButton;
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;
// ------- STOPWATCH BAR
private View mStopwatchBar;
private Button mStopwatchButtonRun;
private Button mStopwatchButtonReset;
public ActionBarManager() {
// ------- COUNTDOWN BAR
private View mCountdownBar;
private EditText mCountdownEntry;
private Button mCountdownButton;
ActionBar aBar = getActionBar();
aBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
aBar.setCustomView(R.layout.presentation_actionbar);
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;
mThumbnailButton = (ToggleButton) aBar.getCustomView()
.findViewById(R.id.actionbar_thumbnailtoggle);
mThumbnailButton.setOnClickListener(this);
public void stop() {
timerHandler.removeCallbacks(timerUpdateThread);
}
mTimeLabel = (ToggleButton) aBar.getCustomView().findViewById(
R.id.actionbar_time);
mTimeLabel.setOnClickListener(this);
public ActionBarManager() {
setupClockBar();
ActionBar aBar = getActionBar();
aBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
aBar.setCustomView(R.layout.presentation_actionbar);
getFragmentManager().addOnBackStackChangedListener(this);
mThumbnailButton = (ToggleButton) aBar.getCustomView()
.findViewById(R.id.actionbar_thumbnailtoggle);
mThumbnailButton.setOnClickListener(this);
timerHandler.removeCallbacks(timerUpdateThread);
timerHandler.postDelayed(timerUpdateThread, 50);
mTimeLabel = (ToggleButton) aBar.getCustomView().findViewById(
R.id.actionbar_time);
mTimeLabel.setOnClickListener(this);
}
setupClockBar();
public void hidePopups() {
if (mClockBar.getVisibility() == View.VISIBLE) {
mClockBar.setVisibility(View.INVISIBLE);
mStopwatchBar.setVisibility(View.INVISIBLE);
mCountdownBar.setVisibility(View.INVISIBLE);
mTimeLabel.setChecked(false);
}
}
getFragmentManager().addOnBackStackChangedListener(this);
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);
timerHandler.removeCallbacks(timerUpdateThread);
timerHandler.postDelayed(timerUpdateThread, 50);
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);
public void hidePopups() {
if (mClockBar.getVisibility() == View.VISIBLE) {
mClockBar.setVisibility(View.INVISIBLE);
mStopwatchBar.setVisibility(View.INVISIBLE);
mCountdownBar.setVisibility(View.INVISIBLE);
mTimeLabel.setChecked(false);
}
}
mStopwatchButtonRun = (Button) mStopwatchBar
.findViewById(R.id.clockbar_stopwatch_run);
mStopwatchButtonReset = (Button) mStopwatchBar
.findViewById(R.id.clockbar_stopwatch_reset);
mStopwatchButtonRun.setOnClickListener(this);
mStopwatchButtonReset.setOnClickListener(this);
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);
// Countdown bar
aInflater.inflate(R.layout.presentation_clockbar_countdownbar,
mOuterLayout);
mCountdownBar = mOuterLayout
.findViewById(R.id.clockbar_countdownbar);
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);
mCountdownEntry = (EditText) mCountdownBar
.findViewById(R.id.clockbar_countdown_time);
mCountdownButton = (Button) mCountdownBar
.findViewById(R.id.clockbar_countdown_button);
mCountdownButton.setOnClickListener(this);
mCountdownEntry.setOnEditorActionListener(this);
// Stopwatch bar
aInflater.inflate(R.layout.presentation_clockbar_stopwatchbar,
mOuterLayout);
mStopwatchBar = mOuterLayout
.findViewById(R.id.clockbar_stopwatchbar);
updateClockBar();
hidePopups();
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);
private void updateClockBar() {
mClockBar_clockButton.setChecked(!mTimerOn);
mCountdownEntry = (EditText) mCountdownBar
.findViewById(R.id.clockbar_countdown_time);
mCountdownButton = (Button) mCountdownBar
.findViewById(R.id.clockbar_countdown_button);
mCountdownButton.setOnClickListener(this);
mCountdownEntry.setOnEditorActionListener(this);
mCountdownBar.setY(mClockBar.getHeight());
mStopwatchBar.setY(mClockBar.getHeight());
updateClockBar();
hidePopups();
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 void updateClockBar() {
if (mCommunicationService == null) {
return;
}
mClockBar_clockButton.setChecked(!mTimerOn);
}
mCountdownBar.setY(mClockBar.getHeight());
mStopwatchBar.setY(mClockBar.getHeight());
private Handler timerHandler = new Handler();
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);
}
}
private Thread timerUpdateThread = new Thread() {
// 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);
}
}
@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);
}
}
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 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 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;
}
}
@Override
public void onBackStackChanged() {
if (getFragmentManager().getBackStackEntryCount() == 0) {
mThumbnailButton.setChecked(false);
}
}
/**
* Intermediate layout that catches all touches, used in order to hide
* the clock menu as appropriate.
* @author andy
*
*/
private class InterceptorLayout extends FrameLayout {
@Override
public boolean onEditorAction(TextView tv, int aID, KeyEvent aEvent) {
if (aEvent.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
public InterceptorLayout(Context context) {
super(context);
}
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;
}
}
@Override
public boolean onInterceptTouchEvent(MotionEvent aEvent) {
mActionBarManager.hidePopups();
return super.onInterceptTouchEvent(aEvent);
}
/**
* Intermediate layout that catches all touches, used in order to hide
* the clock menu as appropriate.
* @author andy
*
*/
private class InterceptorLayout extends FrameLayout {
@Override
public boolean onTouchEvent(MotionEvent aEvent) {
return super.onTouchEvent(aEvent);
}
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);
}
}
}

View File

@@ -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 {

View File

@@ -61,6 +61,12 @@ public class SelectorActivity extends Activity {
refreshLists();
}
@Override
protected void onDestroy() {
super.onDestroy();
LocalBroadcastManager.getInstance(this).unregisterReceiver(mListener);
}
@Override
public void onBackPressed() {
mCommunicationService.stopFindingServers();

View File

@@ -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);
}
}
};
}

View File

@@ -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 CommunicationService mCommunicationService;
private GridView mGrid;
private ImageView mCurrentImage;
private TextView mCurrentText;
private GridView mGrid;
private ImageView mCurrentImage;
private TextView mCurrentText;
private SlideShow mSlideShow;
private Context mContext;
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);
@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 = (GridView) v.findViewById(R.id.thumbnail_grid);
mGrid.setOnItemClickListener(new ClickListener());
mContext = container.getContext();
mGrid.setOnItemClickListener(new ClickListener());
mContext = getActivity().getApplicationContext();
if (mCommunicationService != null && mSlideShow != null) {
mGrid.setAdapter(new ThumbnailAdapter(mContext, mSlideShow));
}
if (mCommunicationService != null && mSlideShow != null) {
mGrid.setAdapter(new ThumbnailAdapter(mContext, mSlideShow));
}
return v;
}
IntentFilter aFilter = new IntentFilter(
CommunicationService.MSG_SLIDE_CHANGED);
aFilter.addAction(CommunicationService.MSG_SLIDE_PREVIEW);
LocalBroadcastManager
.getInstance(getActivity().getApplicationContext())
.registerReceiver(mListener, aFilter);
@Override
public void onDestroyView() {
super.onDestroyView();
mGrid = null;
mContext = null;
mCurrentImage = null;
mCurrentText = null;
}
return v;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@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);
@Override
public void onPause() {
super.onPause();
}
if (mGrid == null) {
return;
}
private void setSelected(int position) {
formatUnselected(mCurrentImage, mCurrentText);
View aV = mGrid.getChildAt(position);
if (aV != null) {
mCurrentImage = (ImageView) aV.findViewById(R.id.sub_thumbnail);
mCurrentText = (TextView) aV.findViewById(R.id.sub_number);
if (mGrid == null) {
return;
}
formatSelected(mCurrentImage, mCurrentText);
}
}
View aV = mGrid.getChildAt(position);
if (aV != null) {
mCurrentImage = (ImageView) aV.findViewById(R.id.sub_thumbnail);
mCurrentText = (TextView) aV.findViewById(R.id.sub_number);
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));
}
}
formatSelected(mCurrentImage, mCurrentText);
}
}
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));
}
}
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));
}
}
// ----------------------------------------------------- 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);
}
}
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));
}
}
// ---------------------------------------------------- MESSAGE HANDLER ----
// ----------------------------------------------------- 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);
}
}
public void setCommunicationService(
CommunicationService aCommunicationService) {
mCommunicationService = aCommunicationService;
mSlideShow = mCommunicationService.getSlideShow();
if (mGrid != null) {
mGrid.setAdapter(new ThumbnailAdapter(mContext, mSlideShow));
}
}
// ---------------------------------------------------- MESSAGE HANDLER ----
public void handleMessage(Message aMessage) {
if (!isVisible()) {
return;
}
public void setCommunicationService(
CommunicationService aCommunicationService) {
mCommunicationService = aCommunicationService;
mSlideShow = mCommunicationService.getSlideShow();
if (mGrid != null) {
mGrid.setAdapter(new ThumbnailAdapter(mContext, mSlideShow));
}
}
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;
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;
// ------------------------------------------------- THUMBNAIL ADAPTER ----
protected class ThumbnailAdapter extends BaseAdapter {
private SlideShow mSlideShow;
private Context mContext;
public ThumbnailAdapter(Context aContext, SlideShow aSlideShow) {
mContext = aContext;
mSlideShow = aSlideShow;
}
private SlideShow mSlideShow;
@Override
public int getCount() {
return mSlideShow.getSize();
}
public ThumbnailAdapter(Context aContext, SlideShow aSlideShow) {
mContext = aContext;
mSlideShow = aSlideShow;
}
@Override
public Object getItem(int arg0) {
return null;
}
@Override
public int getCount() {
return mSlideShow.getSize();
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public Object getItem(int arg0) {
return null;
}
@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);
@Override
public long getItemId(int position) {
return 0;
}
ImageView aImage = (ImageView) v.findViewById(R.id.sub_thumbnail);
TextView aText = (TextView) v.findViewById(R.id.sub_number);
@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);
// Do the image & number styling
int aBorderWidth = getResources().getInteger(
R.integer.thumbnail_border_width);
aImage.setPadding(aBorderWidth, aBorderWidth, aBorderWidth,
aBorderWidth);
ImageView aImage = (ImageView) v.findViewById(R.id.sub_thumbnail);
TextView aText = (TextView) v.findViewById(R.id.sub_number);
if ((mSlideShow != null)
&& (position == mSlideShow.getCurrentSlide())) {
formatSelected(aImage, aText);
mCurrentImage = aImage;
mCurrentText = aText;
} else {
formatUnselected(aImage, aText);
}
// Do the image & number styling
int aBorderWidth = getResources().getInteger(
R.integer.thumbnail_border_width);
aImage.setPadding(aBorderWidth, aBorderWidth, aBorderWidth,
aBorderWidth);
Bitmap aBitmap = mSlideShow.getImage(position);
// Width
int aWidth = (mGrid.getWidth()) / 3 - 20;
aImage.setMaxWidth(aWidth);
aImage.setScaleType(ScaleType.FIT_CENTER);
if ((mSlideShow != null)
&& (position == mSlideShow.getCurrentSlide())) {
formatSelected(aImage, aText);
mCurrentImage = aImage;
mCurrentText = aText;
} else {
formatUnselected(aImage, aText);
}
if (aBitmap != null) {
aImage.setImageBitmap(aBitmap);
}
Bitmap aBitmap = mSlideShow.getImage(position);
// Width
int aWidth = (mGrid.getWidth()) / 3 - 20;
aImage.setMaxWidth(aWidth);
aImage.setScaleType(ScaleType.FIT_CENTER);
aText.setText(String.valueOf(position + 1));
if (aBitmap != null) {
aImage.setImageBitmap(aBitmap);
}
return v;
}
}
aText.setText(String.valueOf(position + 1));
return v;
}
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -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 "";
}
}
/**

View File

@@ -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: */

View File

@@ -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;
public Receiver(Context aContext) {
mContext = aContext;
mSlideShow = new SlideShow(mContext);
}
private SlideShow mSlideShow = new SlideShow();
private Context mContext;
public SlideShow getSlideShow() {
return mSlideShow;
}
private SlideShow mSlideShow;
public void setActivityMessenger(Messenger aActivityMessenger) {
mActivityMessenger = aActivityMessenger;
}
public SlideShow getSlideShow() {
return mSlideShow;
}
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);
public boolean isSlideShowRunning() {
return (mSlideShow.getSize() > 0);
}
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;
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")) {
if (aInstruction.equals("slide_updated")) {
int aSlideNumber = Integer.parseInt(aCommand.get(1));
int aSlideNumber = Integer.parseInt(aCommand.get(1));
mSlideShow.setCurrentSlide(aSlideNumber);
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);
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);
// 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);
}
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);
// 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();
}
}
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: */

View File

@@ -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 SparseArray<byte[]> mPreviewImages = new SparseArray<byte[]>();
private SparseArray<String> mNotes = new SparseArray<String>();
private int mSize = 0;
private int mCurrentSlide = 0;
private int mSize = 0;
private int mCurrentSlide = 0;
private Context mContext;
protected SlideShow() {
}
protected SlideShow(Context aContext) {
mContext = aContext;
}
protected void setLength(int aSize) {
mSize = aSize;
}
protected void setLength(int aSize) {
mSize = aSize;
}
public int getSize() {
return mSize;
}
public int getSize() {
return mSize;
}
public int getCurrentSlide() {
return mCurrentSlide;
}
public int getCurrentSlide() {
return mCurrentSlide;
}
protected void setCurrentSlide(int aSlide) {
mCurrentSlide = aSlide;
}
protected void setCurrentSlide(int aSlide) {
mCurrentSlide = aSlide;
}
protected void putImage(int aSlide, byte[] aImage) {
mPreviewImages.put(aSlide, aImage);
}
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);
}
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);
}
protected void putNotes(int aSlide, String aNotes) {
mNotes.put(aSlide, aNotes);
}
public String getNotes(int aSlide) {
return mNotes.get(aSlide);
}
public String getNotes(int aSlide) {
return mNotes.get(aSlide);
}
// ---------------------------------------------------- TIMER --------------
private Timer mTimer = new Timer();
// ---------------------------------------------------- TIMER --------------
private Timer mTimer = new Timer();
public Timer getTimer() {
return mTimer;
}
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;
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 long mCountdownTime = 0;
private boolean mIsRunning = false;
private boolean mIsRunning = false;
private boolean mIsCountdown = 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 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;
}
/**
* 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 long getCountdownTime() {
return mCountdownTime;
}
public boolean isCountdown() {
return mIsCountdown;
}
public boolean isCountdown() {
return mIsCountdown;
}
public boolean isRunning() {
return mIsRunning;
}
public boolean isRunning() {
return mIsRunning;
}
/**
* Reset the timer, and stop it it was running.
*/
public void reset() {
mIsRunning = false;
aTime = 0;
}
/**
* Reset the timer, and stop it it was running.
*/
public void reset() {
mIsRunning = false;
aTime = 0;
}
public void startTimer() {
if (mIsRunning)
return;
public void startTimer() {
if (mIsRunning)
return;
aTime = System.currentTimeMillis() - aTime;
mIsRunning = true;
}
aTime = System.currentTimeMillis() - aTime;
mIsRunning = true;
}
public void stopTimer() {
if (!mIsRunning)
return;
public void stopTimer() {
if (!mIsRunning)
return;
aTime = System.currentTimeMillis() - aTime;
mIsRunning = false;
}
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;
}
/**
* 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: */

View File

@@ -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: */
///* -*- 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: */