package com.commonsware.android.advservice.client; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.support.v4.app.Fragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; import com.commonsware.android.advservice.IInputStreamService; import com.commonsware.android.advservice.IThreadListener; import com.commonsware.android.advservice.ParcelFileDescriptorUtil; import org.apache.commons.io.IOUtils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; public class InputStreamClientFragment extends Fragment implements ServiceConnection { private final static String TAG = "InputStreamClientFragment"; private IInputStreamService service = null; private Button btn = null; private Button btn2 = null; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View result = inflater.inflate(R.layout.main, container, false); btn = (Button) result.findViewById(R.id.test1); btn.setOnClickListener(test1Listener); btn.setEnabled((service != null)); btn2 = (Button) result.findViewById(R.id.test2); btn2.setOnClickListener(test2Listener); btn2.setEnabled((service != null)); return (result); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setRetainInstance(true); getActivity().getApplicationContext() .bindService(new Intent( "com.commonsware.android.advservice.IInputStreamService"), this, Context.BIND_AUTO_CREATE); } @Override public void onDestroy() { getActivity().getApplicationContext().unbindService(this); super.onDestroy(); } @Override public void onServiceConnected(ComponentName className, IBinder binder) { service = IInputStreamService.Stub.asInterface(binder); btn.setEnabled(true); btn2.setEnabled(true); } @Override public void onServiceDisconnected(ComponentName className) { service = null; } OnClickListener test1Listener = new OnClickListener() { @Override public void onClick(View v) { doTest1(); } }; OnClickListener test2Listener = new OnClickListener() { @Override public void onClick(View v) { doTest2(); } }; private void doTest1() { try { // send the input and output pfds InputStream is = new ByteArrayInputStream( "Colorless green ideas sleep furiously".getBytes("UTF-8")); ParcelFileDescriptor input = ParcelFileDescriptorUtil.pipeFrom(is, new IThreadListener() { @Override public void onThreadFinished(Thread thread) { Log.d(TAG, "Test #1: copy to service finished"); } }); final ByteArrayOutputStream os = new ByteArrayOutputStream(); ParcelFileDescriptor output = ParcelFileDescriptorUtil.pipeTo(os, new IThreadListener() { @Override public void onThreadFinished(Thread thread) { // service finished writing try { Log.d(TAG, "Test #1 read result: " + os.toByteArray().length + " str=" + os.toString("UTF-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } }); // blocks until result is ready service.sendInputStreams(input, output); output.close(); // <-- this is required to halt the TransferThread } catch (RemoteException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } private void doTest2() { Log.d(TAG, "Test2: fetching OutputStream"); // Step 1: get OutputStream from service and write to it try { InputStream is = new ByteArrayInputStream( "Colorless green ideas sleep furiously".getBytes("UTF-8")); ParcelFileDescriptor pfd = service.getOutputStream(); if (pfd == null) Log.e(TAG, "sadface PFD NULL"); OutputStream os = new ParcelFileDescriptor.AutoCloseOutputStream(pfd); try { int count = IOUtils.copy(is, os); Log.d(TAG, "test #2: wrote " + count); os.flush(); // just in case? } catch (IOException e) { e.printStackTrace(); } finally { try { is.close(); } catch (IOException e1) { e1.printStackTrace(); } try { os.close(); } catch (IOException e1) { e1.printStackTrace(); } } } catch (RemoteException e2) { e2.printStackTrace(); } catch (UnsupportedEncodingException e2) { e2.printStackTrace(); } } }