diff options
author | Andrzej J.R. Hunt <andrzej@ahunt.org> | 2012-08-14 12:59:22 +0200 |
---|---|---|
committer | Andrzej J.R. Hunt <andrzej@ahunt.org> | 2012-08-14 18:29:30 +0200 |
commit | e02468f6e8b5d15635c2c9986ca249a8254192d1 (patch) | |
tree | bd1a1275329fc156b448c06f7d57e8b02d4629ff /android/sdremote | |
parent | e1fb965edba01883ce83421693cdb548f992381a (diff) |
Added rotation of presentation view.
Change-Id: Iea68b7740c5e7cf9380c91b8b85ff02fd9c11b8e
Diffstat (limited to 'android/sdremote')
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 Binary files differindex b0d7bef534d6..7d1b1c968bb9 100644 --- a/android/sdremote/res/drawable-hdpi/handle_light.9.png +++ b/android/sdremote/res/drawable-hdpi/handle_light.9.png diff --git a/android/sdremote/res/drawable-hdpi/handle_vertical_default.9.png b/android/sdremote/res/drawable-hdpi/handle_vertical_default.9.png Binary files differnew file mode 100644 index 000000000000..830493c1f90c --- /dev/null +++ b/android/sdremote/res/drawable-hdpi/handle_vertical_default.9.png diff --git a/android/sdremote/res/drawable-hdpi/handle_vertical_light.9.png b/android/sdremote/res/drawable-hdpi/handle_vertical_light.9.png Binary files differnew file mode 100644 index 000000000000..8246c398347b --- /dev/null +++ b/android/sdremote/res/drawable-hdpi/handle_vertical_light.9.png 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 Binary files differnew file mode 100644 index 000000000000..830493c1f90c --- /dev/null +++ b/android/sdremote/res/drawable-mdpi/handle_vertical_default.9.png diff --git a/android/sdremote/res/drawable-mdpi/handle_vertical_light.9.png b/android/sdremote/res/drawable-mdpi/handle_vertical_light.9.png Binary files differnew file mode 100644 index 000000000000..8246c398347b --- /dev/null +++ b/android/sdremote/res/drawable-mdpi/handle_vertical_light.9.png diff --git a/android/sdremote/res/drawable-xhdpi/handle_vertical_default.9.png b/android/sdremote/res/drawable-xhdpi/handle_vertical_default.9.png Binary files differnew file mode 100644 index 000000000000..830493c1f90c --- /dev/null +++ b/android/sdremote/res/drawable-xhdpi/handle_vertical_default.9.png diff --git a/android/sdremote/res/drawable-xhdpi/handle_vertical_light.9.png b/android/sdremote/res/drawable-xhdpi/handle_vertical_light.9.png Binary files differnew file mode 100644 index 000000000000..8246c398347b --- /dev/null +++ b/android/sdremote/res/drawable-xhdpi/handle_vertical_light.9.png 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 |