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