|
using System; |
|
using System.Linq; |
|
using System.Threading; |
|
using Android.App; |
|
using Android.Content; |
|
using Android.Net.Wifi; |
|
using Android.Runtime; |
|
using Android.Widget; |
|
using Android.OS; |
|
|
|
namespace WifiShizniz |
|
{ |
|
[Activity(Label = "WifiShizniz", MainLauncher = true, Icon = "@drawable/icon")] |
|
public class Activity1 : Activity |
|
{ |
|
private ListView _listView; |
|
private ArrayAdapter<WifiEntry> _adapter; |
|
private string _selectedSsid; |
|
|
|
protected override void OnCreate(Bundle bundle) |
|
{ |
|
base.OnCreate(bundle); |
|
|
|
// Set our view from the "main" layout resource |
|
SetContentView(Resource.Layout.Main); |
|
|
|
_listView = FindViewById<ListView>(Resource.Id.listView1); |
|
RefreshWifiList(); |
|
|
|
_listView.ItemClick += ListViewOnItemClick; |
|
} |
|
|
|
private void ListViewOnItemClick(object sender, AdapterView.ItemClickEventArgs itemClickEventArgs) |
|
{ |
|
var wifiItem = _adapter.GetItem(itemClickEventArgs.Position); |
|
|
|
_selectedSsid = wifiItem.SSID; |
|
|
|
if (wifiItem.Encryption.Contains("WPA")) |
|
{ |
|
OnCreateDialog(WpaDialog).Show(); |
|
} |
|
else if (wifiItem.Encryption.Contains("WEP")) |
|
{ |
|
OnCreateDialog(WepDialog).Show(); |
|
} |
|
else |
|
{ |
|
//Other, captive portal, open network, etc. |
|
} |
|
} |
|
|
|
private void RefreshWifiList() |
|
{ |
|
var wifiManager = GetSystemService(WifiService).JavaCast<WifiManager>(); |
|
wifiManager.StartScan(); |
|
|
|
ThreadPool.QueueUserWorkItem(lol => |
|
{ |
|
while (true) |
|
{ |
|
Thread.Sleep(TimeSpan.FromSeconds(3)); |
|
|
|
var wifiList = wifiManager.ScanResults; |
|
|
|
if (null == _adapter) |
|
{ |
|
_adapter = new ArrayAdapter<WifiEntry>(this, Android.Resource.Layout.SimpleListItem1, |
|
Android.Resource.Id.Text1); |
|
RunOnUiThread(() => _listView.Adapter = _adapter); |
|
} |
|
|
|
if (_adapter.Count > 0) |
|
{ |
|
RunOnUiThread(() => _adapter.Clear()); |
|
} |
|
|
|
|
|
foreach (var wifi in wifiList) |
|
{ |
|
var wifi1 = wifi; |
|
RunOnUiThread(() => _adapter.Add(new WifiEntry { SSID = wifi1.Ssid, Encryption = wifi1.Capabilities})); |
|
} |
|
|
|
RunOnUiThread(() => _adapter.NotifyDataSetChanged()); |
|
} |
|
}); |
|
} |
|
|
|
private const int WpaDialog = 0; |
|
private const int WepDialog = 1; |
|
|
|
protected override Dialog OnCreateDialog(int id) |
|
{ |
|
var customView = LayoutInflater.Inflate(Resource.Layout.wifi_dialog, null); |
|
var builder = new AlertDialog.Builder(this); |
|
builder.SetIcon(Android.Resource.Drawable.IcMenuPreferences); |
|
builder.SetView(customView); |
|
builder.SetTitle("Set WiFi password"); |
|
|
|
switch(id) |
|
{ |
|
case WpaDialog: |
|
{ |
|
builder.SetPositiveButton("OK", WpaOkClicked); |
|
builder.SetNegativeButton("Cancel", CancelClicked); |
|
|
|
return builder.Create(); |
|
} |
|
case WepDialog: |
|
{ |
|
builder.SetPositiveButton("OK", WepOkClicked); |
|
builder.SetNegativeButton("Cancel", CancelClicked); |
|
|
|
return builder.Create(); |
|
} |
|
} |
|
|
|
return base.OnCreateDialog(id); |
|
} |
|
|
|
private void WepOkClicked(object sender, DialogClickEventArgs e) |
|
{ |
|
var dialog = (AlertDialog) sender; |
|
var password = (EditText) dialog.FindViewById(Resource.Id.password); |
|
|
|
var conf = new WifiConfiguration(); |
|
conf.Ssid = "\"" + _selectedSsid + "\""; |
|
conf.WepKeys[0] = "\"" + password + "\""; |
|
conf.WepTxKeyIndex = 0; |
|
conf.AllowedKeyManagement.Set((int)KeyManagementType.None); |
|
conf.AllowedGroupCiphers.Set((int)GroupCipherType.Wep40); |
|
|
|
var wifiManager = GetSystemService(WifiService).JavaCast<WifiManager>(); |
|
wifiManager.AddNetwork(conf); |
|
|
|
foreach (var network in |
|
wifiManager.ConfiguredNetworks.Where(network => network.Ssid.Contains(_selectedSsid))) |
|
{ |
|
wifiManager.Disconnect(); |
|
wifiManager.EnableNetwork(network.NetworkId, true); |
|
wifiManager.Reconnect(); |
|
} |
|
} |
|
|
|
private void WpaOkClicked(object sender, DialogClickEventArgs e) |
|
{ |
|
var dialog = (AlertDialog)sender; |
|
var password = (EditText)dialog.FindViewById(Resource.Id.password); |
|
|
|
var conf = new WifiConfiguration(); |
|
conf.Ssid = "\"" + _selectedSsid + "\""; |
|
conf.PreSharedKey = "\"" + password + "\""; |
|
|
|
var wifiManager = GetSystemService(WifiService).JavaCast<WifiManager>(); |
|
wifiManager.AddNetwork(conf); |
|
|
|
foreach (var network in |
|
wifiManager.ConfiguredNetworks.Where(network => network.Ssid.Contains(_selectedSsid))) |
|
{ |
|
wifiManager.Disconnect(); |
|
wifiManager.EnableNetwork(network.NetworkId, true); |
|
wifiManager.Reconnect(); |
|
} |
|
} |
|
|
|
private void CancelClicked(object sender, DialogClickEventArgs e) |
|
{ |
|
|
|
} |
|
} |
|
|
|
public class WifiEntry |
|
{ |
|
public string SSID { get; set; } |
|
public string Encryption { get; set; } |
|
|
|
public override string ToString() |
|
{ |
|
return SSID + " : " + Encryption; |
|
} |
|
} |
|
} |