summaryrefslogtreecommitdiff
path: root/android
diff options
context:
space:
mode:
authorAndrzej J.R. Hunt <andrzej@ahunt.org>2012-08-14 12:59:22 +0200
committerAndrzej J.R. Hunt <andrzej@ahunt.org>2012-08-14 18:29:30 +0200
commite02468f6e8b5d15635c2c9986ca249a8254192d1 (patch)
treebd1a1275329fc156b448c06f7d57e8b02d4629ff /android
parente1fb965edba01883ce83421693cdb548f992381a (diff)
Added rotation of presentation view.
Change-Id: Iea68b7740c5e7cf9380c91b8b85ff02fd9c11b8e
Diffstat (limited to 'android')
-rw-r--r--android/sdremote/res/drawable-hdpi/handle_light.9.pngbin222 -> 203 bytes
-rw-r--r--android/sdremote/res/drawable-hdpi/handle_vertical_default.9.pngbin0 -> 263 bytes
-rw-r--r--android/sdremote/res/drawable-hdpi/handle_vertical_light.9.pngbin0 -> 202 bytes
-rw-r--r--android/sdremote/res/drawable-land/handle.xml9
-rw-r--r--android/sdremote/res/drawable-mdpi/handle_vertical_default.9.pngbin0 -> 263 bytes
-rw-r--r--android/sdremote/res/drawable-mdpi/handle_vertical_light.9.pngbin0 -> 202 bytes
-rw-r--r--android/sdremote/res/drawable-xhdpi/handle_vertical_default.9.pngbin0 -> 263 bytes
-rw-r--r--android/sdremote/res/drawable-xhdpi/handle_vertical_light.9.pngbin0 -> 202 bytes
-rw-r--r--android/sdremote/res/layout-land/fragment_presentation.xml54
-rw-r--r--android/sdremote/res/layout/activity_pairing.xml17
-rw-r--r--android/sdremote/res/values/strings.xml2
-rw-r--r--android/sdremote/src/org/libreoffice/impressremote/PairingActivity.java41
-rw-r--r--android/sdremote/src/org/libreoffice/impressremote/PresentationFragment.java453
-rw-r--r--android/sdremote/src/org/libreoffice/impressremote/SelectorActivity.java5
-rw-r--r--android/sdremote/src/org/libreoffice/impressremote/communication/Client.java5
-rw-r--r--android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java16
-rw-r--r--android/sdremote/src/org/libreoffice/impressremote/communication/NetworkClient.java11
-rw-r--r--android/sdremote/src/org/libreoffice/impressremote/communication/ServerFinder.java10
18 files changed, 386 insertions, 237 deletions
diff --git a/android/sdremote/res/drawable-hdpi/handle_light.9.png b/android/sdremote/res/drawable-hdpi/handle_light.9.png
index b0d7bef534d6..7d1b1c968bb9 100644
--- a/android/sdremote/res/drawable-hdpi/handle_light.9.png
+++ b/android/sdremote/res/drawable-hdpi/handle_light.9.png
Binary files differ
diff --git a/android/sdremote/res/drawable-hdpi/handle_vertical_default.9.png b/android/sdremote/res/drawable-hdpi/handle_vertical_default.9.png
new file mode 100644
index 000000000000..830493c1f90c
--- /dev/null
+++ b/android/sdremote/res/drawable-hdpi/handle_vertical_default.9.png
Binary files differ
diff --git a/android/sdremote/res/drawable-hdpi/handle_vertical_light.9.png b/android/sdremote/res/drawable-hdpi/handle_vertical_light.9.png
new file mode 100644
index 000000000000..8246c398347b
--- /dev/null
+++ b/android/sdremote/res/drawable-hdpi/handle_vertical_light.9.png
Binary files differ
diff --git a/android/sdremote/res/drawable-land/handle.xml b/android/sdremote/res/drawable-land/handle.xml
new file mode 100644
index 000000000000..3656e835035d
--- /dev/null
+++ b/android/sdremote/res/drawable-land/handle.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:drawable="@drawable/handle_vertical_light" android:state_activated="true"/>
+ <item android:drawable="@drawable/handle_vertical_light" android:state_pressed="true"/>
+ <item android:drawable="@drawable/handle_vertical_light" android:state_focused="true"/>
+ <item android:drawable="@drawable/handle_vertical_default"/>
+
+</selector> \ No newline at end of file
diff --git a/android/sdremote/res/drawable-mdpi/handle_vertical_default.9.png b/android/sdremote/res/drawable-mdpi/handle_vertical_default.9.png
new file mode 100644
index 000000000000..830493c1f90c
--- /dev/null
+++ b/android/sdremote/res/drawable-mdpi/handle_vertical_default.9.png
Binary files differ
diff --git a/android/sdremote/res/drawable-mdpi/handle_vertical_light.9.png b/android/sdremote/res/drawable-mdpi/handle_vertical_light.9.png
new file mode 100644
index 000000000000..8246c398347b
--- /dev/null
+++ b/android/sdremote/res/drawable-mdpi/handle_vertical_light.9.png
Binary files differ
diff --git a/android/sdremote/res/drawable-xhdpi/handle_vertical_default.9.png b/android/sdremote/res/drawable-xhdpi/handle_vertical_default.9.png
new file mode 100644
index 000000000000..830493c1f90c
--- /dev/null
+++ b/android/sdremote/res/drawable-xhdpi/handle_vertical_default.9.png
Binary files differ
diff --git a/android/sdremote/res/drawable-xhdpi/handle_vertical_light.9.png b/android/sdremote/res/drawable-xhdpi/handle_vertical_light.9.png
new file mode 100644
index 000000000000..8246c398347b
--- /dev/null
+++ b/android/sdremote/res/drawable-xhdpi/handle_vertical_light.9.png
Binary files differ
diff --git a/android/sdremote/res/layout-land/fragment_presentation.xml b/android/sdremote/res/layout-land/fragment_presentation.xml
new file mode 100644
index 000000000000..1cdd4d3f3312
--- /dev/null
+++ b/android/sdremote/res/layout-land/fragment_presentation.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/presentation_layout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="horizontal" >
+
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:orientation="vertical" >
+
+ <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_marginTop="5dip"
+ coverflow:imageHeight="150dip"
+ coverflow:imageWidth="180dip"
+ coverflow:withReflection="false" />
+
+ <TextView
+ android:id="@+id/presentation_slidenumber"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:text="" />
+ </LinearLayout>
+
+ <ImageView
+ android:id="@+id/presentation_handle"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_marginLeft="6dp"
+ android:layout_marginRight="6dp"
+ android:contentDescription="@string/presentation_ui_resizehandle"
+ android:paddingBottom="5dp"
+ android:paddingTop="5dp"
+ android:scaleType="fitXY"
+ android:src="@drawable/handle" />
+
+ <ScrollView
+ android:id="@+id/presentation_scrollview"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" >
+
+ <WebView
+ android:id="@+id/presentation_notes"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+ </ScrollView>
+
+</LinearLayout> \ No newline at end of file
diff --git a/android/sdremote/res/layout/activity_pairing.xml b/android/sdremote/res/layout/activity_pairing.xml
index 122dec613081..d2f06bdb40c8 100644
--- a/android/sdremote/res/layout/activity_pairing.xml
+++ b/android/sdremote/res/layout/activity_pairing.xml
@@ -5,24 +5,29 @@
android:orientation="vertical" >
<TextView
- android:id="@+id/textView1"
+ android:id="@+id/pairing_instruction1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
+ android:layout_margin="10dip"
+ android:gravity="center"
android:text="@string/pairing_instructions_1" />
<TextView
- android:id="@+id/textView2"
+ android:id="@+id/pairing_instruction2_deviceName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
- android:text="@string/pairing_instructions_2" />
+ android:layout_margin="10dip"
+ android:gravity="center"
+ android:text="@string/pairing_instructions_2_deviceName" />
<TextView
- android:id="@+id/textView3"
+ android:id="@+id/pairing_instruction3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
+ android:layout_margin="10dip"
android:text="@string/pairing_instructions_3" />
<TextView
@@ -30,7 +35,9 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
+ android:layout_margin="10dip"
android:text=""
- android:textAppearance="?android:attr/textAppearanceLarge" />
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:textSize="75dip" />
</LinearLayout> \ No newline at end of file
diff --git a/android/sdremote/res/values/strings.xml b/android/sdremote/res/values/strings.xml
index 523f53865faa..c86d5c92c94c 100644
--- a/android/sdremote/res/values/strings.xml
+++ b/android/sdremote/res/values/strings.xml
@@ -24,7 +24,7 @@
<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">Choose "{1}" as your device.</string>
+ <string name="pairing_instructions_2_deviceName">Choose "{1}" as your device.</string>
<string name="pairing_instructions_3">Then input this PIN:</string>
</resources> \ No newline at end of file
diff --git a/android/sdremote/src/org/libreoffice/impressremote/PairingActivity.java b/android/sdremote/src/org/libreoffice/impressremote/PairingActivity.java
index 386098ca8af4..9298e437625f 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/PairingActivity.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/PairingActivity.java
@@ -8,26 +8,36 @@
*/
package org.libreoffice.impressremote;
+import java.text.MessageFormat;
+
import org.libreoffice.impressremote.communication.CommunicationService;
+import org.libreoffice.impressremote.communication.CommunicationService.State;
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.widget.TextView;
public class PairingActivity extends Activity {
-
+ private CommunicationService mCommunicationService;
+ private boolean mIsBound = false;
private TextView mPinText;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_pairing);
+
+ bindService(new Intent(this, CommunicationService.class), mConnection,
+ Context.BIND_IMPORTANT);
+ mIsBound = true;
mPinText = (TextView) findViewById(R.id.pairing_pin);
@@ -46,6 +56,33 @@ public class PairingActivity extends Activity {
// refreshLists();
}
+ private ServiceConnection mConnection = new ServiceConnection() {
+ @Override
+ public void onServiceConnected(ComponentName aClassName,
+ IBinder aService) {
+ setContentView(R.layout.activity_pairing);
+
+ ((TextView) findViewById(R.id.pairing_instruction2_deviceName))
+ .setText(MessageFormat
+ .format(getResources()
+ .getString(R.string.pairing_instructions_2_deviceName),
+ mCommunicationService
+ .getDeviceName()));
+
+ mCommunicationService = ((CommunicationService.CBinder) aService)
+ .getService();
+ if (mCommunicationService.getState() == State.CONNECTING) {
+ mPinText.setText(mCommunicationService.getPairingPin());
+ }
+
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName aClassName) {
+ mCommunicationService = null;
+ }
+ };
+
private BroadcastReceiver mListener = new BroadcastReceiver() {
@Override
diff --git a/android/sdremote/src/org/libreoffice/impressremote/PresentationFragment.java b/android/sdremote/src/org/libreoffice/impressremote/PresentationFragment.java
index 4b759ef633e5..9f8d49aad71a 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/PresentationFragment.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/PresentationFragment.java
@@ -7,6 +7,7 @@ import pl.polidea.coverflow.AbstractCoverFlowImageAdapter;
import pl.polidea.coverflow.CoverFlow;
import android.app.Fragment;
import android.content.Context;
+import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
@@ -28,224 +29,236 @@ import android.widget.TextView;
public class PresentationFragment extends Fragment {
- private CoverFlow mTopView;
- private ImageView mHandle;
- private View mLayout;
- private WebView mNotes;
- private Context mContext;
- private TextView mNumberText;
-
- private CommunicationService mCommunicationService;
- private SlideShow mSlideShow;
-
- private float mOriginalCoverflowWidth;
- private float mOriginalCoverflowHeight;
-
- private float mNewCoverflowWidth = 0;
- private float mNewCoverflowHeight = 0;
-
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- mContext = container.getContext();
-
- View v = inflater.inflate(R.layout.fragment_presentation, container,
- false);
-
- mNotes = (WebView) v.findViewById(R.id.presentation_notes);
-
- String summary = "<html><body>This is just a test<br/><ul><li>And item</li><li>And again</li></ul>More text<br/>Blabla<br/>Blabla<br/>blabla<br/>Blabla</body></html>";
- mNotes.loadData(summary, "text/html", null);
- mNotes.setBackgroundColor(Color.TRANSPARENT);
-
- // TextView aText = new TextView();
- // aText.setText
-
- mTopView = (CoverFlow) v.findViewById(R.id.presentation_coverflow);
-
- mLayout = v.findViewById(R.id.presentation_layout);
-
- mNumberText = (TextView) v.findViewById(R.id.presentation_slidenumber);
-
- mHandle = (ImageView) v.findViewById(R.id.presentation_handle);
- mHandle.setOnTouchListener(new SizeListener());
-
- // Call again to set things up if necessary.
- setCommunicationService(mCommunicationService);
-
- // Save the height/width for future reference
- mOriginalCoverflowHeight = mTopView.getImageHeight();
- mOriginalCoverflowWidth = mTopView.getImageWidth();
-
- if (mNewCoverflowHeight != 0) {
- ThumbnailAdapter aAdapter = (ThumbnailAdapter) mTopView
- .getAdapter();
- aAdapter.setHeight(mNewCoverflowHeight);
- mTopView.setImageHeight(mNewCoverflowHeight);
- aAdapter.setWidth(mNewCoverflowWidth);
- mTopView.setImageWidth(mNewCoverflowWidth);
-
- // We need to update the view now
- aAdapter.notifyDataSetChanged();
- }
- return v;
- }
-
- private void updateSlideNumberDisplay() {
- int aSlide = mSlideShow.getCurrentSlide();
- mNumberText.setText((aSlide + 1) + "/" + mSlideShow.getSize());
- mNotes.loadData(mSlideShow.getNotes(aSlide), "text/html", null);
- }
-
- // -------------------------------------------------- RESIZING LISTENER ----
- private class SizeListener implements OnTouchListener {
-
- @Override
- public boolean onTouch(View aView, MotionEvent aEvent) {
-
- switch (aEvent.getAction()) {
- case MotionEvent.ACTION_DOWN:
- mHandle.setImageResource(R.drawable.handle_light);
- break;
- case MotionEvent.ACTION_UP:
- mHandle.setImageResource(R.drawable.handle_default);
- break;
- case MotionEvent.ACTION_MOVE:
- LayoutParams aParams = mTopView.getLayoutParams();
- int aHeight = mTopView.getHeight();
- int aViewSize = mLayout.getHeight();
-
- final int DRAG_MARGIN = 120;
-
- // Calculate height change, taking limits into account
- int aDiff = (int) (aEvent.getY());
- if (aDiff + aHeight < DRAG_MARGIN) {
- aDiff = DRAG_MARGIN - aHeight;
- } else if ((aHeight + aDiff) > (aViewSize - DRAG_MARGIN)) {
- aDiff = (aViewSize - DRAG_MARGIN) - aHeight;
- }
-
- // Now deal with the internal height
- AbstractCoverFlowImageAdapter aAdapter = (AbstractCoverFlowImageAdapter) mTopView
- .getAdapter();
-
- double aRatio = mOriginalCoverflowWidth
- / mOriginalCoverflowHeight;
- float aHeightNew = mTopView.getImageHeight() + aDiff;
- float aWidthNew = (float) (aRatio * aHeightNew);
-
- // Too wide -- so scale down
- if (aWidthNew > mLayout.getWidth() - 50) {
- aWidthNew = mLayout.getWidth() - 50;
- aHeightNew = (float) (aWidthNew / aRatio);
- aDiff = (int) (aHeightNew - mTopView.getImageHeight());
- }
-
- mNewCoverflowHeight = aHeightNew;
- mNewCoverflowWidth = aWidthNew;
-
- aAdapter.setHeight(aHeightNew);
- mTopView.setImageHeight(aHeightNew);
- aAdapter.setWidth(aWidthNew);
- mTopView.setImageWidth(aWidthNew);
-
- // Force an update of the view
- aAdapter.notifyDataSetChanged();
-
- break;
- }
- // TODO Auto-generated method stub
- return true;
- }
- }
-
- // ----------------------------------------------------- CLICK LISTENER ----
-
- protected class ClickListener implements OnItemSelectedListener {
-
- @Override
- public void onItemSelected(AdapterView<?> arg0, View arg1,
- int aPosition, long arg3) {
- if (mCommunicationService != null)
- mCommunicationService.getTransmitter().gotoSlide(aPosition);
- }
-
- @Override
- public void onNothingSelected(AdapterView<?> arg0) {
- }
- }
-
- // ---------------------------------------------------- MESSAGE HANDLER ----
- public void setCommunicationService(
- CommunicationService aCommunicationService) {
- mCommunicationService = aCommunicationService;
- if (mCommunicationService == null)
- return;
-
- mSlideShow = mCommunicationService.getSlideShow();
- if (mTopView != null && mSlideShow != null) {
- mTopView.setAdapter(new ThumbnailAdapter(mContext, mSlideShow));
- mTopView.setSelection(mSlideShow.getCurrentSlide(), true);
- mTopView.setOnItemSelectedListener(new ClickListener());
- }
-
- 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
- }
- break;
-
- }
- }
-
- // ------------------------------------------------- THUMBNAIL ADAPTER ----
- protected class ThumbnailAdapter extends AbstractCoverFlowImageAdapter {
-
- private Context mContext;
-
- private SlideShow mSlideShow;
-
- public ThumbnailAdapter(Context aContext, SlideShow aSlideShow) {
- mContext = aContext;
- mSlideShow = aSlideShow;
- }
-
- @Override
- public int getCount() {
- return mSlideShow.getSize();
- }
-
- @Override
- protected Bitmap createBitmap(int position) {
- Bitmap aBitmap = mSlideShow.getImage(position);
- final int borderWidth = 8;
-
- Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
- p.setShadowLayer(borderWidth, 0, 0, Color.BLACK);
-
- RectF aRect = new RectF(borderWidth, borderWidth, borderWidth
- + aBitmap.getWidth(), borderWidth
- + aBitmap.getHeight());
- Bitmap aOut = Bitmap.createBitmap(aBitmap.getWidth() + 2
- * borderWidth, aBitmap.getHeight() + 2
- * borderWidth, aBitmap.getConfig());
- Canvas canvas = new Canvas(aOut);
- canvas.drawColor(Color.TRANSPARENT);
- canvas.drawRect(aRect, p);
- canvas.drawBitmap(aBitmap, null, aRect, null);
-
- return aOut;
- }
- }
+ private CoverFlow mTopView;
+ private ImageView mHandle;
+ private View mLayout;
+ private WebView mNotes;
+ private Context mContext;
+ private TextView mNumberText;
+
+ private CommunicationService mCommunicationService;
+ private SlideShow mSlideShow;
+
+ private float mOriginalCoverflowWidth;
+ private float mOriginalCoverflowHeight;
+
+ private float mNewCoverflowWidth = 0;
+ private float mNewCoverflowHeight = 0;
+
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ mContext = container.getContext();
+
+ View v = inflater.inflate(R.layout.fragment_presentation, container,
+ false);
+
+ mNotes = (WebView) v.findViewById(R.id.presentation_notes);
+
+ String summary = "<html><body>This is just a test<br/><ul><li>And item</li><li>And again</li></ul>More text<br/>Blabla<br/>Blabla<br/>blabla<br/>Blabla</body></html>";
+ mNotes.loadData(summary, "text/html", null);
+ mNotes.setBackgroundColor(Color.TRANSPARENT);
+
+ mTopView = (CoverFlow) v.findViewById(R.id.presentation_coverflow);
+
+ mLayout = v.findViewById(R.id.presentation_layout);
+
+ mNumberText = (TextView) v.findViewById(R.id.presentation_slidenumber);
+
+ mHandle = (ImageView) v.findViewById(R.id.presentation_handle);
+ mHandle.setOnTouchListener(new SizeListener());
+
+ // Call again to set things up if necessary.
+ setCommunicationService(mCommunicationService);
+
+ // Save the height/width for future reference
+ mOriginalCoverflowHeight = mTopView.getImageHeight();
+ mOriginalCoverflowWidth = mTopView.getImageWidth();
+
+ if (mNewCoverflowHeight != 0) {
+ ThumbnailAdapter aAdapter = (ThumbnailAdapter) mTopView
+ .getAdapter();
+ aAdapter.setHeight(mNewCoverflowHeight);
+ mTopView.setImageHeight(mNewCoverflowHeight);
+ aAdapter.setWidth(mNewCoverflowWidth);
+ mTopView.setImageWidth(mNewCoverflowWidth);
+
+ // We need to update the view now
+ aAdapter.notifyDataSetChanged();
+ }
+ return v;
+ }
+
+ private void updateSlideNumberDisplay() {
+ int aSlide = mSlideShow.getCurrentSlide();
+ mNumberText.setText((aSlide + 1) + "/" + mSlideShow.getSize());
+ mNotes.loadData(mSlideShow.getNotes(aSlide), "text/html", null);
+ }
+
+ // -------------------------------------------------- RESIZING LISTENER ----
+ private class SizeListener implements OnTouchListener {
+
+ @Override
+ public boolean onTouch(View aView, MotionEvent aEvent) {
+
+ switch (aEvent.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ mHandle.setImageResource(R.drawable.handle_light);
+ break;
+ case MotionEvent.ACTION_UP:
+ mHandle.setImageResource(R.drawable.handle_default);
+ break;
+ case MotionEvent.ACTION_MOVE:
+ LayoutParams aParams = mTopView.getLayoutParams();
+
+ final int DRAG_MARGIN = 120;
+
+ boolean aPortrait = (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT);
+
+ int aFlowSize = mTopView.getHeight();
+ int aViewSize = mLayout.getHeight();
+
+ // Calculate height change, taking limits into account
+ int aDiff = (int) (aPortrait ? aEvent.getY() : aEvent.getX());
+ if (aDiff + aFlowSize < DRAG_MARGIN) {
+ aDiff = DRAG_MARGIN - aFlowSize;
+ } else if ((aFlowSize + aDiff) > (aViewSize - DRAG_MARGIN)) {
+ aDiff = (aViewSize - DRAG_MARGIN) - aFlowSize;
+ }
+
+ // Now deal with the internal height
+ AbstractCoverFlowImageAdapter aAdapter = (AbstractCoverFlowImageAdapter) mTopView
+ .getAdapter();
+
+ double aRatio = mOriginalCoverflowWidth
+ / mOriginalCoverflowHeight;
+ float aHeightNew;
+ float aWidthNew;
+ if (aPortrait) {
+ aHeightNew = mTopView.getImageHeight() + aDiff;
+ aWidthNew = (float) (aRatio * aHeightNew);
+ // Too wide -- so scale down
+ if (aWidthNew > mLayout.getWidth() - 50) {
+ aWidthNew = mLayout.getWidth() - 50;
+ aHeightNew = (float) (aWidthNew / aRatio);
+ aDiff = (int) (aHeightNew - mTopView.getImageHeight());
+ }
+ } else {
+ aWidthNew = mTopView.getImageWidth();
+ aHeightNew = (float) (aWidthNew / aRatio);
+ // Too High -- so scale down
+ if (aHeightNew > mLayout.getHeight() - 50) {
+ aHeightNew = mLayout.getHeight() - 50;
+ aWidthNew = (float) (aHeightNew / aRatio);
+ aDiff = (int) (aWidthNew - mTopView.getImageWidth());
+ }
+ }
+
+ mNewCoverflowHeight = aHeightNew;
+ mNewCoverflowWidth = aWidthNew;
+
+ aAdapter.setHeight(aHeightNew);
+ mTopView.setImageHeight(aHeightNew);
+ aAdapter.setWidth(aWidthNew);
+ mTopView.setImageWidth(aWidthNew);
+
+ // Force an update of the view
+ aAdapter.notifyDataSetChanged();
+
+ break;
+ }
+ // TODO Auto-generated method stub
+ return true;
+ }
+ }
+
+ // ----------------------------------------------------- CLICK LISTENER ----
+
+ protected class ClickListener implements OnItemSelectedListener {
+
+ @Override
+ public void onItemSelected(AdapterView<?> arg0, View arg1,
+ int aPosition, long arg3) {
+ if (mCommunicationService != null)
+ mCommunicationService.getTransmitter().gotoSlide(aPosition);
+ }
+
+ @Override
+ public void onNothingSelected(AdapterView<?> arg0) {
+ }
+ }
+
+ // ---------------------------------------------------- MESSAGE HANDLER ----
+ public void setCommunicationService(
+ CommunicationService aCommunicationService) {
+ mCommunicationService = aCommunicationService;
+ if (mCommunicationService == null)
+ return;
+
+ mSlideShow = mCommunicationService.getSlideShow();
+ if (mTopView != null && mSlideShow != null) {
+ mTopView.setAdapter(new ThumbnailAdapter(mContext, mSlideShow));
+ mTopView.setSelection(mSlideShow.getCurrentSlide(), true);
+ mTopView.setOnItemSelectedListener(new ClickListener());
+ }
+
+ 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
+ }
+ break;
+
+ }
+ }
+
+ // ------------------------------------------------- THUMBNAIL ADAPTER ----
+ protected class ThumbnailAdapter extends AbstractCoverFlowImageAdapter {
+
+ private Context mContext;
+
+ private SlideShow mSlideShow;
+
+ public ThumbnailAdapter(Context aContext, SlideShow aSlideShow) {
+ mContext = aContext;
+ mSlideShow = aSlideShow;
+ }
+
+ @Override
+ public int getCount() {
+ return mSlideShow.getSize();
+ }
+
+ @Override
+ protected Bitmap createBitmap(int position) {
+ Bitmap aBitmap = mSlideShow.getImage(position);
+ final int borderWidth = 8;
+
+ Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
+ p.setShadowLayer(borderWidth, 0, 0, Color.BLACK);
+
+ RectF aRect = new RectF(borderWidth, borderWidth, borderWidth
+ + aBitmap.getWidth(), borderWidth
+ + aBitmap.getHeight());
+ Bitmap aOut = Bitmap.createBitmap(aBitmap.getWidth() + 2
+ * borderWidth, aBitmap.getHeight() + 2
+ * borderWidth, aBitmap.getConfig());
+ Canvas canvas = new Canvas(aOut);
+ canvas.drawColor(Color.TRANSPARENT);
+ canvas.drawRect(aRect, p);
+ canvas.drawBitmap(aBitmap, null, aRect, null);
+
+ return aOut;
+ }
+ }
}
diff --git a/android/sdremote/src/org/libreoffice/impressremote/SelectorActivity.java b/android/sdremote/src/org/libreoffice/impressremote/SelectorActivity.java
index a51df87b88be..a07896ffabec 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/SelectorActivity.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/SelectorActivity.java
@@ -158,9 +158,9 @@ public class SelectorActivity extends Activity {
aLayout);
TextView aText = (TextView) aView
.findViewById(R.id.selector_sub_label);
- aView.setOnClickListener(mClickListener);
+ aText.setOnClickListener(mClickListener);
aText.setText(aServer.getName());
- aMap.put(aServer, aView);
+ aMap.put(aServer, aText);
}
}
@@ -182,7 +182,6 @@ public class SelectorActivity extends Activity {
@Override
public void onClick(View aView) {
- // TODO Auto-generated method stub
mCommunicationService.stopFindingServers();
Server aDesiredServer = null;
diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/Client.java b/android/sdremote/src/org/libreoffice/impressremote/communication/Client.java
index 2864b9db90b6..044d38a4ec2e 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/communication/Client.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/communication/Client.java
@@ -32,6 +32,7 @@ public abstract class Client {
protected InputStream mInputStream;
protected BufferedReader mReader;
protected OutputStream mOutputStream;
+ protected String mPin = "";
public abstract void closeConnection();
@@ -79,6 +80,10 @@ public abstract class Client {
}
+ public String getPin() {
+ return mPin;
+ }
+
/**
* Send a valid JSON string to the server.
*
diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java b/android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java
index 73b6f3db3bf5..75634949e9dc 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java
@@ -27,6 +27,22 @@ public class CommunicationService extends Service implements Runnable {
private State mState = State.DISCONNECTED;
+ public State getState() {
+ return mState;
+ }
+
+ public String getPairingPin() {
+ if (mClient != null)
+ return mClient.getPin();
+ else
+ return "";
+ }
+
+ public String getDeviceName() {
+ return "Bob";
+ // FIXME: get the device name somehow.
+ }
+
private State mStateDesired = State.DISCONNECTED;
private Server mServerDesired = null;
diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/NetworkClient.java b/android/sdremote/src/org/libreoffice/impressremote/communication/NetworkClient.java
index 33b600b02b62..1e04747c9d7d 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/communication/NetworkClient.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/communication/NetworkClient.java
@@ -17,7 +17,6 @@ import java.util.Random;
import android.content.Context;
import android.content.Intent;
-import android.os.StrictMode;
import android.support.v4.content.LocalBroadcastManager;
/**
@@ -33,10 +32,6 @@ public class NetworkClient extends Client {
public NetworkClient(String ipAddress, Context aContext) {
super(aContext);
- // FIXME: eventually networking will be fully threaded.
- StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
- .permitAll().build();
- StrictMode.setThreadPolicy(policy);
try {
mSocket = new Socket(ipAddress, PORT);
mInputStream = mSocket.getInputStream();
@@ -45,10 +40,14 @@ public class NetworkClient extends Client {
mOutputStream = mSocket.getOutputStream();
// Pairing.
Random aRandom = new Random();
- String aPin = "" + aRandom.nextInt(10000);
+ String aPin = "" + (aRandom.nextInt(9000) + 1000);
+ while (aPin.length() < 4) {
+ aPin = "0" + aPin; // Add leading zeros if necessary
+ }
Intent aIntent = new Intent(
CommunicationService.MSG_PAIRING_STARTED);
aIntent.putExtra("PIN", aPin);
+ mPin = aPin;
LocalBroadcastManager.getInstance(mContext).sendBroadcast(aIntent);
// Send out
String aName = "Bob"; // TODO: get the proper name
diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/ServerFinder.java b/android/sdremote/src/org/libreoffice/impressremote/communication/ServerFinder.java
index 55b6f5472b49..4b7edbd91f61 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/communication/ServerFinder.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/communication/ServerFinder.java
@@ -8,6 +8,8 @@ import java.net.InetAddress;
import java.net.SocketException;
import java.util.HashMap;
+import org.libreoffice.impressremote.communication.Server.Protocol;
+
import android.content.Context;
import android.content.Intent;
import android.support.v4.content.LocalBroadcastManager;
@@ -93,6 +95,14 @@ public class ServerFinder {
mFinishRequested = false;
+ // TODO: Remove for production
+ mServerList.put("10.0.2.2",
+ new Server(Protocol.NETWORK, "10.0.2.2",
+ "Android Emulator Localhost", System
+ .currentTimeMillis()));
+ Intent aIntent = new Intent(CommunicationService.MSG_SERVERLIST_CHANGED);
+ LocalBroadcastManager.getInstance(mContext).sendBroadcast(aIntent);
+
if (mListenerThread == null) {
mListenerThread = new Thread() {
@Override