WiFiDirectDemo
Change-Id: I9ea5020a39f02fd2ba4934397fa9a2ea79f781b4
This commit is contained in:
@@ -0,0 +1,266 @@
|
||||
/*
|
||||
* Copyright (C) 2011 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.wifidirect;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.net.wifi.p2p.WifiP2pConfig;
|
||||
import android.net.wifi.p2p.WifiP2pDevice;
|
||||
import android.net.wifi.p2p.WifiP2pManager;
|
||||
import android.net.wifi.p2p.WifiP2pManager.ActionListener;
|
||||
import android.net.wifi.p2p.WifiP2pManager.Channel;
|
||||
import android.net.wifi.p2p.WifiP2pManager.ChannelListener;
|
||||
import android.os.Bundle;
|
||||
import android.provider.Settings;
|
||||
import android.util.Log;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.example.android.wifidirect.DeviceListFragment.DeviceActionListener;
|
||||
|
||||
/**
|
||||
* An activity that uses WiFi Direct APIs to discover and connect with available
|
||||
* devices. WiFi Direct APIs are asynchronous and rely on callback mechanism
|
||||
* using interfaces to notify the application of operation success or failure.
|
||||
* The application should also register a BroadcastReceiver for notification of
|
||||
* WiFi state related events.
|
||||
*/
|
||||
public class WiFiDirectActivity extends Activity implements ChannelListener, DeviceActionListener {
|
||||
|
||||
public static final String TAG = "wifidirectdemo";
|
||||
private WifiP2pManager manager;
|
||||
private boolean isWifiP2pEnabled = false;
|
||||
private boolean retryChannel = false;
|
||||
|
||||
private final IntentFilter intentFilter = new IntentFilter();
|
||||
private Channel channel;
|
||||
private BroadcastReceiver receiver = null;
|
||||
|
||||
/**
|
||||
* @param isWifiP2pEnabled the isWifiP2pEnabled to set
|
||||
*/
|
||||
public void setIsWifiP2pEnabled(boolean isWifiP2pEnabled) {
|
||||
this.isWifiP2pEnabled = isWifiP2pEnabled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.main);
|
||||
|
||||
// add necessary intent values to be matched.
|
||||
|
||||
intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
|
||||
intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
|
||||
intentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
|
||||
intentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
|
||||
|
||||
manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
|
||||
channel = manager.initialize(this, getMainLooper(), null);
|
||||
}
|
||||
|
||||
/** register the BroadcastReceiver with the intent values to be matched */
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
receiver = new WiFiDirectBroadcastReceiver(manager, channel, this);
|
||||
registerReceiver(receiver, intentFilter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause() {
|
||||
super.onPause();
|
||||
unregisterReceiver(receiver);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove all peers and clear all fields. This is called on
|
||||
* BroadcastReceiver receiving a state change event.
|
||||
*/
|
||||
public void resetData() {
|
||||
DeviceListFragment fragmentList = (DeviceListFragment) getFragmentManager()
|
||||
.findFragmentById(R.id.frag_list);
|
||||
DeviceDetailFragment fragmentDetails = (DeviceDetailFragment) getFragmentManager()
|
||||
.findFragmentById(R.id.frag_detail);
|
||||
if (fragmentList != null) {
|
||||
fragmentList.clearPeers();
|
||||
}
|
||||
if (fragmentDetails != null) {
|
||||
fragmentDetails.resetViews();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
MenuInflater inflater = getMenuInflater();
|
||||
inflater.inflate(R.menu.action_items, menu);
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see android.app.Activity#onOptionsItemSelected(android.view.MenuItem)
|
||||
*/
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
switch (item.getItemId()) {
|
||||
case R.id.atn_direct_enable:
|
||||
if (manager != null && channel != null) {
|
||||
|
||||
// Since this is the system wireless settings activity, it's
|
||||
// not going to send us a result. We will be notified by
|
||||
// WiFiDeviceBroadcastReceiver instead.
|
||||
|
||||
startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS));
|
||||
} else {
|
||||
Log.e(TAG, "channel or manager is null");
|
||||
}
|
||||
return true;
|
||||
|
||||
case R.id.atn_direct_discover:
|
||||
if (!isWifiP2pEnabled) {
|
||||
Toast.makeText(WiFiDirectActivity.this, R.string.p2p_off_warning,
|
||||
Toast.LENGTH_SHORT).show();
|
||||
return true;
|
||||
}
|
||||
final DeviceListFragment fragment = (DeviceListFragment) getFragmentManager()
|
||||
.findFragmentById(R.id.frag_list);
|
||||
fragment.onInitiateDiscovery();
|
||||
manager.discoverPeers(channel, new WifiP2pManager.ActionListener() {
|
||||
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
Toast.makeText(WiFiDirectActivity.this, "Discovery Initiated",
|
||||
Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(int reasonCode) {
|
||||
Toast.makeText(WiFiDirectActivity.this, "Discovery Failed : " + reasonCode,
|
||||
Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
});
|
||||
return true;
|
||||
default:
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showDetails(WifiP2pDevice device) {
|
||||
DeviceDetailFragment fragment = (DeviceDetailFragment) getFragmentManager()
|
||||
.findFragmentById(R.id.frag_detail);
|
||||
fragment.showDetails(device);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void connect(WifiP2pConfig config) {
|
||||
manager.connect(channel, config, new ActionListener() {
|
||||
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
// WiFiDirectBroadcastReceiver will notify us. Ignore for now.
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(int reason) {
|
||||
Toast.makeText(WiFiDirectActivity.this, "Connect failed. Retry.",
|
||||
Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void disconnect() {
|
||||
final DeviceDetailFragment fragment = (DeviceDetailFragment) getFragmentManager()
|
||||
.findFragmentById(R.id.frag_detail);
|
||||
fragment.resetViews();
|
||||
manager.removeGroup(channel, new ActionListener() {
|
||||
|
||||
@Override
|
||||
public void onFailure(int reasonCode) {
|
||||
Log.d(TAG, "Disconnect failed. Reason :" + reasonCode);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
fragment.getView().setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChannelDisconnected() {
|
||||
// we will try once more
|
||||
if (manager != null && !retryChannel) {
|
||||
Toast.makeText(this, "Channel lost. Trying again", Toast.LENGTH_LONG).show();
|
||||
resetData();
|
||||
retryChannel = true;
|
||||
manager.initialize(this, getMainLooper(), this);
|
||||
} else {
|
||||
Toast.makeText(this,
|
||||
"Severe! Channel is probably lost premanently. Try Disable/Re-Enable P2P.",
|
||||
Toast.LENGTH_LONG).show();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cancelDisconnect() {
|
||||
|
||||
/*
|
||||
* A cancel abort request by user. Disconnect i.e. removeGroup if
|
||||
* already connected. Else, request WifiP2pManager to abort the ongoing
|
||||
* request
|
||||
*/
|
||||
if (manager != null) {
|
||||
final DeviceListFragment fragment = (DeviceListFragment) getFragmentManager()
|
||||
.findFragmentById(R.id.frag_list);
|
||||
if (fragment.getDevice() == null
|
||||
|| fragment.getDevice().status == WifiP2pDevice.CONNECTED) {
|
||||
disconnect();
|
||||
} else if (fragment.getDevice().status == WifiP2pDevice.AVAILABLE
|
||||
|| fragment.getDevice().status == WifiP2pDevice.INVITED) {
|
||||
|
||||
manager.cancelConnect(channel, new ActionListener() {
|
||||
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
Toast.makeText(WiFiDirectActivity.this, "Aborting connection",
|
||||
Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(int reasonCode) {
|
||||
Toast.makeText(WiFiDirectActivity.this,
|
||||
"Connect abort request failed. Reason Code: " + reasonCode,
|
||||
Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user