112634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani/* 212634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani * Copyright (C) 2011 The Android Open Source Project 312634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani * 412634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani * Licensed under the Apache License, Version 2.0 (the "License"); 512634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani * you may not use this file except in compliance with the License. 612634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani * You may obtain a copy of the License at 712634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani * 812634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani * http://www.apache.org/licenses/LICENSE-2.0 912634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani * 1012634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani * Unless required by applicable law or agreed to in writing, software 1112634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani * distributed under the License is distributed on an "AS IS" BASIS, 1212634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1312634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani * See the License for the specific language governing permissions and 1412634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani * limitations under the License. 1512634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani */ 1612634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 1712634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewanipackage com.example.android.wifidirect; 1812634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 1912634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewaniimport android.app.Fragment; 2012634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewaniimport android.app.ProgressDialog; 2112634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewaniimport android.content.Context; 2212634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewaniimport android.content.DialogInterface; 2312634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewaniimport android.content.Intent; 2412634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewaniimport android.net.Uri; 2512634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewaniimport android.net.wifi.WpsInfo; 2612634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewaniimport android.net.wifi.p2p.WifiP2pConfig; 2712634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewaniimport android.net.wifi.p2p.WifiP2pDevice; 2812634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewaniimport android.net.wifi.p2p.WifiP2pInfo; 2912634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewaniimport android.net.wifi.p2p.WifiP2pManager.ConnectionInfoListener; 3012634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewaniimport android.os.AsyncTask; 3112634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewaniimport android.os.Bundle; 3212634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewaniimport android.os.Environment; 3312634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewaniimport android.util.Log; 3412634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewaniimport android.view.LayoutInflater; 3512634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewaniimport android.view.View; 3612634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewaniimport android.view.ViewGroup; 3712634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewaniimport android.widget.TextView; 3812634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 3912634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewaniimport com.example.android.wifidirect.DeviceListFragment.DeviceActionListener; 4012634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 4112634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewaniimport java.io.File; 4212634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewaniimport java.io.FileOutputStream; 4312634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewaniimport java.io.IOException; 4412634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewaniimport java.io.InputStream; 4512634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewaniimport java.io.OutputStream; 4612634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewaniimport java.net.ServerSocket; 4712634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewaniimport java.net.Socket; 4812634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 4912634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani/** 5012634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani * A fragment that manages a particular peer and allows interaction with device 5112634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani * i.e. setting up network connection and transferring data. 5212634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani */ 5312634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewanipublic class DeviceDetailFragment extends Fragment implements ConnectionInfoListener { 5412634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 5512634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani protected static final int CHOOSE_FILE_RESULT_CODE = 20; 5612634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani private View mContentView = null; 5712634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani private WifiP2pDevice device; 5812634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani private WifiP2pInfo info; 5912634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani ProgressDialog progressDialog = null; 6012634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 6112634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani @Override 6212634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani public void onActivityCreated(Bundle savedInstanceState) { 6312634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani super.onActivityCreated(savedInstanceState); 6412634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani } 6512634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 6612634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani @Override 6712634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 6812634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 6912634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani mContentView = inflater.inflate(R.layout.device_detail, null); 7012634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani mContentView.findViewById(R.id.btn_connect).setOnClickListener(new View.OnClickListener() { 7112634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 7212634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani @Override 7312634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani public void onClick(View v) { 7412634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani WifiP2pConfig config = new WifiP2pConfig(); 7512634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani config.deviceAddress = device.deviceAddress; 7612634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani config.wps.setup = WpsInfo.PBC; 7712634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani if (progressDialog != null && progressDialog.isShowing()) { 7812634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani progressDialog.dismiss(); 7912634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani } 8012634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani progressDialog = ProgressDialog.show(getActivity(), "Press back to cancel", 8112634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani "Connecting to :" + device.deviceAddress, true, true 8212634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani// new DialogInterface.OnCancelListener() { 8312634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani// 8412634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani// @Override 8512634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani// public void onCancel(DialogInterface dialog) { 8612634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani// ((DeviceActionListener) getActivity()).cancelDisconnect(); 8712634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani// } 8812634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani// } 8912634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani ); 9012634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani ((DeviceActionListener) getActivity()).connect(config); 9112634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 9212634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani } 9312634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani }); 9412634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 9512634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani mContentView.findViewById(R.id.btn_disconnect).setOnClickListener( 9612634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani new View.OnClickListener() { 9712634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 9812634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani @Override 9912634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani public void onClick(View v) { 10012634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani ((DeviceActionListener) getActivity()).disconnect(); 10112634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani } 10212634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani }); 10312634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 10412634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani mContentView.findViewById(R.id.btn_start_client).setOnClickListener( 10512634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani new View.OnClickListener() { 10612634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 10712634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani @Override 10812634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani public void onClick(View v) { 10912634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani // Allow user to pick an image from Gallery or other 11012634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani // registered apps 11112634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 11212634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani intent.setType("image/*"); 11312634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani startActivityForResult(intent, CHOOSE_FILE_RESULT_CODE); 11412634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani } 11512634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani }); 11612634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 11712634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani return mContentView; 11812634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani } 11912634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 12012634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani @Override 12112634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani public void onActivityResult(int requestCode, int resultCode, Intent data) { 12212634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 12312634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani // User has picked an image. Transfer it to group owner i.e peer using 12412634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani // FileTransferService. 12512634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani Uri uri = data.getData(); 12612634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani TextView statusText = (TextView) mContentView.findViewById(R.id.status_text); 12712634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani statusText.setText("Sending: " + uri); 12812634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani Log.d(WiFiDirectActivity.TAG, "Intent----------- " + uri); 12912634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani Intent serviceIntent = new Intent(getActivity(), FileTransferService.class); 13012634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani serviceIntent.setAction(FileTransferService.ACTION_SEND_FILE); 13112634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani serviceIntent.putExtra(FileTransferService.EXTRAS_FILE_PATH, uri.toString()); 13212634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani serviceIntent.putExtra(FileTransferService.EXTRAS_GROUP_OWNER_ADDRESS, 13312634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani info.groupOwnerAddress.getHostAddress()); 13412634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani serviceIntent.putExtra(FileTransferService.EXTRAS_GROUP_OWNER_PORT, 8988); 13512634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani getActivity().startService(serviceIntent); 13612634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani } 13712634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 13812634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani @Override 13912634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani public void onConnectionInfoAvailable(final WifiP2pInfo info) { 14012634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani if (progressDialog != null && progressDialog.isShowing()) { 14112634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani progressDialog.dismiss(); 14212634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani } 14312634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani this.info = info; 14412634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani this.getView().setVisibility(View.VISIBLE); 14512634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 14612634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani // The owner IP is now known. 14712634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani TextView view = (TextView) mContentView.findViewById(R.id.group_owner); 14812634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani view.setText(getResources().getString(R.string.group_owner_text) 14912634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani + ((info.isGroupOwner == true) ? getResources().getString(R.string.yes) 15012634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani : getResources().getString(R.string.no))); 15112634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 15212634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani // InetAddress from WifiP2pInfo struct. 15312634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani view = (TextView) mContentView.findViewById(R.id.device_info); 15412634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani view.setText("Group Owner IP - " + info.groupOwnerAddress.getHostAddress()); 15512634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 15612634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani // After the group negotiation, we assign the group owner as the file 15712634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani // server. The file server is single threaded, single connection server 15812634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani // socket. 15912634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani if (info.groupFormed && info.isGroupOwner) { 16012634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani new FileServerAsyncTask(getActivity(), mContentView.findViewById(R.id.status_text)) 16112634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani .execute(); 16212634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani } else if (info.groupFormed) { 16312634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani // The other device acts as the client. In this case, we enable the 16412634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani // get file button. 16512634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani mContentView.findViewById(R.id.btn_start_client).setVisibility(View.VISIBLE); 16612634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani ((TextView) mContentView.findViewById(R.id.status_text)).setText(getResources() 16712634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani .getString(R.string.client_text)); 16812634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani } 16912634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 17012634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani // hide the connect button 17112634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani mContentView.findViewById(R.id.btn_connect).setVisibility(View.GONE); 17212634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani } 17312634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 17412634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani /** 17512634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani * Updates the UI with device data 17612634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani * 17712634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani * @param device the device to be displayed 17812634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani */ 17912634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani public void showDetails(WifiP2pDevice device) { 18012634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani this.device = device; 18112634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani this.getView().setVisibility(View.VISIBLE); 18212634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani TextView view = (TextView) mContentView.findViewById(R.id.device_address); 18312634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani view.setText(device.deviceAddress); 18412634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani view = (TextView) mContentView.findViewById(R.id.device_info); 18512634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani view.setText(device.toString()); 18612634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 18712634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani } 18812634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 18912634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani /** 19012634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani * Clears the UI fields after a disconnect or direct mode disable operation. 19112634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani */ 19212634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani public void resetViews() { 19312634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani mContentView.findViewById(R.id.btn_connect).setVisibility(View.VISIBLE); 19412634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani TextView view = (TextView) mContentView.findViewById(R.id.device_address); 19512634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani view.setText(R.string.empty); 19612634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani view = (TextView) mContentView.findViewById(R.id.device_info); 19712634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani view.setText(R.string.empty); 19812634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani view = (TextView) mContentView.findViewById(R.id.group_owner); 19912634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani view.setText(R.string.empty); 20012634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani view = (TextView) mContentView.findViewById(R.id.status_text); 20112634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani view.setText(R.string.empty); 20212634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani mContentView.findViewById(R.id.btn_start_client).setVisibility(View.GONE); 20312634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani this.getView().setVisibility(View.GONE); 20412634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani } 20512634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 20612634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani /** 20712634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani * A simple server socket that accepts connection and writes some data on 20812634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani * the stream. 20912634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani */ 21012634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani public static class FileServerAsyncTask extends AsyncTask<Void, Void, String> { 21112634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 21212634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani private Context context; 21312634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani private TextView statusText; 21412634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 21512634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani /** 21612634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani * @param context 21712634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani * @param statusText 21812634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani */ 21912634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani public FileServerAsyncTask(Context context, View statusText) { 22012634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani this.context = context; 22112634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani this.statusText = (TextView) statusText; 22212634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani } 22312634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 22412634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani @Override 22512634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani protected String doInBackground(Void... params) { 22612634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani try { 22712634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani ServerSocket serverSocket = new ServerSocket(8988); 22812634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani Log.d(WiFiDirectActivity.TAG, "Server: Socket opened"); 22912634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani Socket client = serverSocket.accept(); 23012634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani Log.d(WiFiDirectActivity.TAG, "Server: connection done"); 23112634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani final File f = new File(Environment.getExternalStorageDirectory() + "/" 23212634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani + context.getPackageName() + "/wifip2pshared-" + System.currentTimeMillis() 23312634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani + ".jpg"); 23412634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 23512634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani File dirs = new File(f.getParent()); 23612634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani if (!dirs.exists()) 23712634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani dirs.mkdirs(); 23812634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani f.createNewFile(); 23912634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 24012634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani Log.d(WiFiDirectActivity.TAG, "server: copying files " + f.toString()); 24112634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani InputStream inputstream = client.getInputStream(); 24212634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani copyFile(inputstream, new FileOutputStream(f)); 24312634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani serverSocket.close(); 24412634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani return f.getAbsolutePath(); 24512634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani } catch (IOException e) { 24612634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani Log.e(WiFiDirectActivity.TAG, e.getMessage()); 24712634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani return null; 24812634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani } 24912634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani } 25012634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 25112634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani /* 25212634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani * (non-Javadoc) 25312634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani * @see android.os.AsyncTask#onPostExecute(java.lang.Object) 25412634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani */ 25512634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani @Override 25612634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani protected void onPostExecute(String result) { 25712634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani if (result != null) { 25812634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani statusText.setText("File copied - " + result); 25912634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani Intent intent = new Intent(); 26012634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani intent.setAction(android.content.Intent.ACTION_VIEW); 26112634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani intent.setDataAndType(Uri.parse("file://" + result), "image/*"); 26212634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani context.startActivity(intent); 26312634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani } 26412634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 26512634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani } 26612634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 26712634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani /* 26812634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani * (non-Javadoc) 26912634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani * @see android.os.AsyncTask#onPreExecute() 27012634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani */ 27112634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani @Override 27212634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani protected void onPreExecute() { 27312634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani statusText.setText("Opening a server socket"); 27412634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani } 27512634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 27612634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani } 27712634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 27812634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani public static boolean copyFile(InputStream inputStream, OutputStream out) { 27912634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani byte buf[] = new byte[1024]; 28012634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani int len; 28112634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani try { 28212634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani while ((len = inputStream.read(buf)) != -1) { 28312634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani out.write(buf, 0, len); 28412634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 28512634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani } 28612634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani out.close(); 28712634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani inputStream.close(); 28812634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani } catch (IOException e) { 28912634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani Log.d(WiFiDirectActivity.TAG, e.toString()); 29012634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani return false; 29112634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani } 29212634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani return true; 29312634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani } 29412634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani 29512634496be8d78f09755f831a3b92919af0fc31eAnirudh Dewani} 296