Kaydet (Commit) 0357b778 authored tarafından Andrzej J.R. Hunt's avatar Andrzej J.R. Hunt

Implemented rotation of slideshow view.

Change-Id: Ib518e1609d21463273a00fcf161f20c80eae6a67
üst e02468f6
......@@ -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" >
......
......@@ -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"
......
<?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
......@@ -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
......@@ -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);
}
}
......
......@@ -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 {
......
......@@ -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();
......
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);
}
}
};
}
......@@ -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 "";
}
}
/**
......
......@@ -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
......@@ -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
......@@ -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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment