From 01bfbf2e7e85ce75a659913b2f90b155078d4d91 Mon Sep 17 00:00:00 2001 From: vikrama Date: Fri, 9 Jul 2010 05:49:42 +0000 Subject: [PATCH] Some error checking put in. When a new network is created and the connection fails, an alert message is displayed, and connection attempts cease. Retrying with a correct barcode works. Not perfect yet, but in my testing I have found this version much better than the previous setup: at least errors are detected and the user is informed. git-svn-id: http://zxing.googlecode.com/svn/trunk@1470 59b500cc-1b3d-0410-9834-0bbf25fbcc57 --- android/res/values-ar/strings.xml | 1 + android/res/values-cs/strings.xml | 1 + android/res/values-da/strings.xml | 1 + android/res/values-de/strings.xml | 1 + android/res/values-es/strings.xml | 1 + android/res/values-fi/strings.xml | 1 + android/res/values-fr/strings.xml | 1 + android/res/values-hu/strings.xml | 1 + android/res/values-it/strings.xml | 1 + android/res/values-ja-rJP/strings.xml | 1 + android/res/values-nl/strings.xml | 1 + android/res/values-pl/strings.xml | 1 + android/res/values-pt/strings.xml | 1 + android/res/values-ru/strings.xml | 1 + android/res/values-sv/strings.xml | 1 + android/res/values-zh-rCN/strings.xml | 1 + android/res/values-zh-rTW/strings.xml | 1 + android/res/values/strings.xml | 1 + .../android/result/WifiResultHandler.java | 5 +- .../android/wifi/ConnectedReceiver.java | 59 --------- .../client/android/wifi/NetworkUtil.java | 2 +- .../client/android/wifi/WifiActivity.java | 116 +++++++++++++----- 22 files changed, 109 insertions(+), 91 deletions(-) delete mode 100644 android/src/com/google/zxing/client/android/wifi/ConnectedReceiver.java diff --git a/android/res/values-ar/strings.xml b/android/res/values-ar/strings.xml index ef8a716c..cdd751b2 100644 --- a/android/res/values-ar/strings.xml +++ b/android/res/values-ar/strings.xml @@ -129,5 +129,6 @@ شبكة نوع غير صحيح اسم الشبكة نوع + فشل شبكة الاتصال http://code.google.com/p/zxing diff --git a/android/res/values-cs/strings.xml b/android/res/values-cs/strings.xml index 0c332747..ad5eaef3 100644 --- a/android/res/values-cs/strings.xml +++ b/android/res/values-cs/strings.xml @@ -129,5 +129,6 @@ Typ sítě nesprávné Jméno sítě Typ + Síťové připojení se nezdařilo http://code.google.com/p/zxing diff --git a/android/res/values-da/strings.xml b/android/res/values-da/strings.xml index 2d0084e2..ae4b0ec0 100644 --- a/android/res/values-da/strings.xml +++ b/android/res/values-da/strings.xml @@ -129,5 +129,6 @@ Netværk type forkert Netværksnavn Type + Netværksforbindelse mislykkedes http://code.google.com/p/zxing diff --git a/android/res/values-de/strings.xml b/android/res/values-de/strings.xml index 2b81626a..a1163203 100644 --- a/android/res/values-de/strings.xml +++ b/android/res/values-de/strings.xml @@ -130,4 +130,5 @@ Netzwerk-Typ nicht korrekt Network Name Typ + Network Verbindung fehlgeschlagen diff --git a/android/res/values-es/strings.xml b/android/res/values-es/strings.xml index 0de8733a..f35c2192 100644 --- a/android/res/values-es/strings.xml +++ b/android/res/values-es/strings.xml @@ -129,5 +129,6 @@ Red de tipo incorrecto Nombre de red Tipo + Conexión de red no http://code.google.com/p/zxing diff --git a/android/res/values-fi/strings.xml b/android/res/values-fi/strings.xml index 5a0a5333..1646b034 100644 --- a/android/res/values-fi/strings.xml +++ b/android/res/values-fi/strings.xml @@ -129,5 +129,6 @@ Verkon tyyppi virheellinen Verkon nimi Tyyppi + Verkkoyhteys ei http://code.google.com/p/zxing diff --git a/android/res/values-fr/strings.xml b/android/res/values-fr/strings.xml index 4c1da33c..f966823a 100644 --- a/android/res/values-fr/strings.xml +++ b/android/res/values-fr/strings.xml @@ -129,5 +129,6 @@ Réseau de type incorrect Nom du réseau Type + La connexion réseau a échoué http://code.google.com/p/zxing diff --git a/android/res/values-hu/strings.xml b/android/res/values-hu/strings.xml index a9168cd7..65d8bd8d 100644 --- a/android/res/values-hu/strings.xml +++ b/android/res/values-hu/strings.xml @@ -129,5 +129,6 @@ Hálózati típusú hibás Hálózat neve Típusú + Hálózati kapcsolat nem http://code.google.com/p/zxing diff --git a/android/res/values-it/strings.xml b/android/res/values-it/strings.xml index 8a86d585..05ea4fd2 100644 --- a/android/res/values-it/strings.xml +++ b/android/res/values-it/strings.xml @@ -129,5 +129,6 @@ Tipo di rete non corretto Nome di rete Tipo + La connessione di rete non riuscita http://code.google.com/p/zxing diff --git a/android/res/values-ja-rJP/strings.xml b/android/res/values-ja-rJP/strings.xml index cabc6cdf..c46820f7 100644 --- a/android/res/values-ja-rJP/strings.xml +++ b/android/res/values-ja-rJP/strings.xml @@ -129,5 +129,6 @@ ネットワーク型不正 ネットワーク名 タイプ + ネットワーク接続が失敗しました。 http://code.google.com/p/zxing diff --git a/android/res/values-nl/strings.xml b/android/res/values-nl/strings.xml index 4064592d..3a083eed 100644 --- a/android/res/values-nl/strings.xml +++ b/android/res/values-nl/strings.xml @@ -129,5 +129,6 @@ Netwerk soort onjuiste Network Name Type + Netwerk verbinding is mislukt http://code.google.com/p/zxing diff --git a/android/res/values-pl/strings.xml b/android/res/values-pl/strings.xml index 36fcb57d..9ccfb0d5 100644 --- a/android/res/values-pl/strings.xml +++ b/android/res/values-pl/strings.xml @@ -129,5 +129,6 @@ Typ sieci nieprawidłowe Nazwa sieci Typ + Połączenie sieciowe nie http://code.google.com/p/zxing diff --git a/android/res/values-pt/strings.xml b/android/res/values-pt/strings.xml index 2729d576..24cdea11 100644 --- a/android/res/values-pt/strings.xml +++ b/android/res/values-pt/strings.xml @@ -129,5 +129,6 @@ Rede de tipo incorreto Nome da Rede Tipo + A conexão de rede não http://code.google.com/p/zxing diff --git a/android/res/values-ru/strings.xml b/android/res/values-ru/strings.xml index 85045e57..1aadb72c 100644 --- a/android/res/values-ru/strings.xml +++ b/android/res/values-ru/strings.xml @@ -129,5 +129,6 @@ Тип сети неправильный Имя сети Тип + Подключение к сети не удалось http://code.google.com/p/zxing diff --git a/android/res/values-sv/strings.xml b/android/res/values-sv/strings.xml index 8437c6df..6608fefe 100644 --- a/android/res/values-sv/strings.xml +++ b/android/res/values-sv/strings.xml @@ -129,5 +129,6 @@ Nätverkstyp felaktig Nätverksnamn Typ + Nätverksanslutning misslyckades http://code.google.com/p/zxing diff --git a/android/res/values-zh-rCN/strings.xml b/android/res/values-zh-rCN/strings.xml index ece2f946..2eed42b3 100644 --- a/android/res/values-zh-rCN/strings.xml +++ b/android/res/values-zh-rCN/strings.xml @@ -129,5 +129,6 @@ 网络类型不正确 网络名称 类型 + 网络连接失败 http://code.google.com/p/zxing diff --git a/android/res/values-zh-rTW/strings.xml b/android/res/values-zh-rTW/strings.xml index 2f41725f..feefe432 100644 --- a/android/res/values-zh-rTW/strings.xml +++ b/android/res/values-zh-rTW/strings.xml @@ -129,5 +129,6 @@ 網絡類型不正確 網絡名稱 類型 + 網絡連接失敗 http://code.google.com/p/zxing diff --git a/android/res/values/strings.xml b/android/res/values/strings.xml index b2538f70..6245756e 100755 --- a/android/res/values/strings.xml +++ b/android/res/values/strings.xml @@ -127,6 +127,7 @@ Modifying Network Network name missing Network type incorrect + Network connection failed Network Name Type http://code.google.com/p/zxing diff --git a/android/src/com/google/zxing/client/android/result/WifiResultHandler.java b/android/src/com/google/zxing/client/android/result/WifiResultHandler.java index fa5b7cab..41dd9fd3 100644 --- a/android/src/com/google/zxing/client/android/result/WifiResultHandler.java +++ b/android/src/com/google/zxing/client/android/result/WifiResultHandler.java @@ -17,7 +17,6 @@ package com.google.zxing.client.android.result; import android.app.Activity; - import com.google.zxing.client.android.R; import com.google.zxing.client.result.ParsedResult; import com.google.zxing.client.result.WifiParsedResult; @@ -52,7 +51,7 @@ public final class WifiResultHandler extends ResultHandler { @Override public void handleButtonPress(int index) { // Get the underlying wifi config - WifiParsedResult wifiResult = (WifiParsedResult) getResult(); + final WifiParsedResult wifiResult = (WifiParsedResult) getResult(); if (index == 0) { wifiConnect(wifiResult); } @@ -61,7 +60,7 @@ public final class WifiResultHandler extends ResultHandler { // Display the name of the network and the network type to the user. @Override public CharSequence getDisplayContents() { - WifiParsedResult wifiResult = (WifiParsedResult) getResult(); + final WifiParsedResult wifiResult = (WifiParsedResult) getResult(); StringBuffer contents = new StringBuffer(); final String wifiLabel = parent.getString(R.string.wifi_ssid_label); ParsedResult.maybeAppend(wifiLabel + "\n" + wifiResult.getSsid(), contents); diff --git a/android/src/com/google/zxing/client/android/wifi/ConnectedReceiver.java b/android/src/com/google/zxing/client/android/wifi/ConnectedReceiver.java deleted file mode 100644 index c34fa917..00000000 --- a/android/src/com/google/zxing/client/android/wifi/ConnectedReceiver.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2010 ZXing authors - * - * 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.google.zxing.client.android.wifi; - -import android.app.Activity; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.net.ConnectivityManager; -import android.net.NetworkInfo; -import android.widget.TextView; - -import com.google.zxing.client.android.R; - -/** - * Get a broadcast when the network is connected, and kill the activity. - */ -final class ConnectedReceiver extends BroadcastReceiver { - - private final Activity parent; - private final TextView statusView; - - ConnectedReceiver(Activity wifiActivity, TextView statusView) { - this.parent = wifiActivity; - this.statusView = statusView; - } - - @Override - public void onReceive(Context context, Intent intent) { - if (intent.getAction().equals(android.net.ConnectivityManager.CONNECTIVITY_ACTION)) { - ConnectivityManager con = (ConnectivityManager) parent.getSystemService(Context.CONNECTIVITY_SERVICE); - final NetworkInfo[] s = con.getAllNetworkInfo(); - for (NetworkInfo i : s){ - if (i.getTypeName().contentEquals("WIFI")){ - NetworkInfo.State state = i.getState(); - if (state == NetworkInfo.State.CONNECTED){ - statusView.setText(R.string.wifi_connected); - Runnable delayKill = new Killer(parent); - delayKill.run(); - } - } - } - } - } -} diff --git a/android/src/com/google/zxing/client/android/wifi/NetworkUtil.java b/android/src/com/google/zxing/client/android/wifi/NetworkUtil.java index 4cc5c848..fe151086 100644 --- a/android/src/com/google/zxing/client/android/wifi/NetworkUtil.java +++ b/android/src/com/google/zxing/client/android/wifi/NetworkUtil.java @@ -77,4 +77,4 @@ final class NetworkUtil { return (length == 10 || length == 26 || length == 58) && isHex(wepKey); } -} +} \ No newline at end of file diff --git a/android/src/com/google/zxing/client/android/wifi/WifiActivity.java b/android/src/com/google/zxing/client/android/wifi/WifiActivity.java index 391dd662..f39b7321 100644 --- a/android/src/com/google/zxing/client/android/wifi/WifiActivity.java +++ b/android/src/com/google/zxing/client/android/wifi/WifiActivity.java @@ -33,19 +33,33 @@ import com.google.zxing.client.android.R; /** * A new activity showing the progress of Wifi connection - * - * TODO(viki): Tell the user when the network is not available here - * TODO(viki): Incorrect password, could not connect, give an error * * @author Vikram Aggarwal */ public class WifiActivity extends Activity { private static final String TAG = WifiActivity.class.getSimpleName(); - private WifiManager wifiManager; private TextView statusView; - private ConnectedReceiver connectedReceiver; + private WifiReceiver wifiReceiver; + private boolean receiverRegistered; + private int networkId; + private static int errorCount; + private IntentFilter mWifiStateFilter; + + static { + errorCount = 0; + } + + public void gotError(){ + final int maxErrorCount = 3; + errorCount++; + Log.d(TAG, "Encountered another error. Errorcount = " + errorCount); + if (errorCount > maxErrorCount){ + errorCount = 0; + doError(R.string.wifi_connect_failed); + } + } public enum NetworkType { NETWORK_WEP, NETWORK_WPA, NETWORK_NOPASS, NETWORK_INVALID, @@ -76,13 +90,23 @@ public class WifiActivity extends Activity { private int doError(int resource_string) { statusView.setText(resource_string); + // Give up on the connection + wifiManager.disconnect(); + if (networkId > 0) { + wifiManager.removeNetwork(networkId); + networkId = -1; + } + if (receiverRegistered) { + unregisterReceiver(wifiReceiver); + receiverRegistered = false; + } return -1; } private WifiConfiguration changeNetworkCommon(NetworkSetting input){ statusView.setText(R.string.wifi_creating_network); Log.d(TAG, "Adding new configuration: \nSSID: " + input.getSsid() + "\nType: " + input.getNetworkType()); - WifiConfiguration config = new WifiConfiguration(); + final WifiConfiguration config = new WifiConfiguration(); config.allowedAuthAlgorithms.clear(); config.allowedGroupCiphers.clear(); @@ -103,11 +127,12 @@ public class WifiActivity extends Activity { // Adding a WEP network private int changeNetworkWEP(NetworkSetting input) { - WifiConfiguration config = changeNetworkCommon(input); - if (NetworkUtil.isHexWepKey(input.getPassword())) { - config.wepKeys[0] = input.getPassword(); + final WifiConfiguration config = changeNetworkCommon(input); + final String pass = input.getPassword(); + if (NetworkUtil.isHexWepKey(pass)) { + config.wepKeys[0] = pass; } else { - config.wepKeys[0] = NetworkUtil.convertToQuotedString(input.getPassword()); + config.wepKeys[0] = NetworkUtil.convertToQuotedString(pass); } config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED); config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); @@ -121,7 +146,7 @@ public class WifiActivity extends Activity { // Adding a WPA or WPA2 network private int changeNetworkWPA(NetworkSetting input) { - WifiConfiguration config = changeNetworkCommon(input); + final WifiConfiguration config = changeNetworkCommon(input); final String pass = input.getPassword(); // Hex passwords that are 64 bits long are not to be quoted. if (pass.matches("[0-9A-Fa-f]{64}")){ @@ -144,8 +169,8 @@ public class WifiActivity extends Activity { // Adding an open, unsecured network private int changeNetworkUnEncrypted(NetworkSetting input){ - WifiConfiguration config = changeNetworkCommon(input); Log.d(TAG, "Empty password prompting a simple account setting"); + WifiConfiguration config = changeNetworkCommon(input); config.wepKeys[0] = ""; config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); config.wepTxKeyIndex = 0; @@ -158,7 +183,7 @@ public class WifiActivity extends Activity { */ private WifiConfiguration findNetworkInExistingConfig(String ssid){ final List existingConfigs = wifiManager.getConfiguredNetworks(); - for (WifiConfiguration existingConfig : existingConfigs) { + for (final WifiConfiguration existingConfig : existingConfigs) { if (existingConfig.SSID.equals(ssid)) { return existingConfig; } @@ -182,7 +207,6 @@ public class WifiActivity extends Activity { setContentView(R.layout.network); statusView = (TextView) findViewById(R.id.networkStatus); - // TODO(vikrama): Error checking here, to ensure ssid exists. NetworkType networkT; if (networkType.equals("WPA")) { networkT = NetworkType.NETWORK_WPA; @@ -191,17 +215,25 @@ public class WifiActivity extends Activity { } else if (networkType.equals("nopass")) { networkT = NetworkType.NETWORK_NOPASS; } else { - // Got an incorrect network type. Give an error doError(R.string.wifi_type_incorrect); return; } // This is not available before onCreate wifiManager = (WifiManager) this.getSystemService(WIFI_SERVICE); + // Start WiFi, otherwise nothing will work + wifiManager.setWifiEnabled(true); // So we know when the network changes - connectedReceiver = new ConnectedReceiver(this, statusView); - registerReceiver(connectedReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); + wifiReceiver = new WifiReceiver(wifiManager, this, statusView, ssid); + + // The order matters! + mWifiStateFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION); + mWifiStateFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); + mWifiStateFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); + mWifiStateFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); + registerReceiver(wifiReceiver, mWifiStateFilter); + receiverRegistered = true; if (password == null) { password = ""; @@ -211,11 +243,28 @@ public class WifiActivity extends Activity { changeNetwork(setting); } + public void pause() { + if (receiverRegistered) { + unregisterReceiver(wifiReceiver); + receiverRegistered = false; + } + } + + public void resume() { + if (wifiReceiver != null && mWifiStateFilter != null && !receiverRegistered) { + registerReceiver(wifiReceiver, mWifiStateFilter); + receiverRegistered = true; + } + } + @Override protected void onDestroy() { - if (connectedReceiver != null) { - unregisterReceiver(connectedReceiver); - connectedReceiver = null; + if (wifiReceiver != null) { + if (receiverRegistered) { + unregisterReceiver(wifiReceiver); + receiverRegistered = false; + } + wifiReceiver = null; } super.onDestroy(); } @@ -227,18 +276,29 @@ public class WifiActivity extends Activity { * @return network ID of the connected network. */ private int updateNetwork(WifiConfiguration config, boolean disableOthers){ - int networkId; - if (findNetworkInExistingConfig(config.SSID) == null){ + final int FAILURE = -1; + WifiConfiguration found = findNetworkInExistingConfig(config.SSID); + wifiManager.disconnect(); + if (found == null){ statusView.setText(R.string.wifi_creating_network); - networkId = wifiManager.addNetwork(config); } else { statusView.setText(R.string.wifi_modifying_network); - networkId = wifiManager.updateNetwork(config); - } - if (networkId == -1 || !wifiManager.enableNetwork(networkId, disableOthers)) { - return -1; + Log.d(TAG, "Removing network " + found.networkId); + wifiManager.removeNetwork(found.networkId); + wifiManager.saveConfiguration(); + } + networkId = wifiManager.addNetwork(config); + Log.d(TAG, "Inserted/Modified network " + networkId); + if (networkId < 0) + return FAILURE; + + // Try to disable the current network and start a new one. + if (!wifiManager.enableNetwork(networkId, disableOthers)) { + networkId = -1; + return FAILURE; } - wifiManager.saveConfiguration(); + errorCount = 0; + wifiManager.reassociate(); return networkId; } } \ No newline at end of file -- 2.20.1