package com.iwedia.gui.components.dialogs; import android.content.Context; import android.content.DialogInterface; import android.content.res.TypedArray; import android.graphics.Color; import android.os.Handler; import android.os.Message; import android.os.RemoteException; import android.util.Log; import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.LinearLayout.LayoutParams; import android.widget.ListView; import android.widget.TextView; import com.iwedia.comm.enums.WirelessState; import com.iwedia.comm.enums.WpsState; import com.iwedia.comm.system.INetworkSettings; import com.iwedia.comm.system.WifiScanResult; import com.iwedia.gui.MainActivity; import com.iwedia.gui.R; import com.iwedia.gui.components.A4TVButton; import com.iwedia.gui.components.A4TVDialog; import com.iwedia.gui.components.A4TVEditText; import com.iwedia.gui.components.A4TVProgressDialog; import com.iwedia.gui.components.A4TVTextView; import com.iwedia.gui.components.A4TVToast; import com.iwedia.gui.mainmenu.DialogCreatorClass; import com.iwedia.gui.mainmenu.DialogManager; import com.iwedia.gui.mainmenu.MainMenuContent; import java.util.ArrayList; /** * Wireless network find AP dialog * * @author Mladen Ilic */ public class NetworkWirelessFindWPSDialog extends A4TVDialog implements A4TVDialogInterface, android.view.View.OnClickListener, OnItemClickListener { /** IDs for buttons */ public static final int TV_MENU_NETWORK_WIRELESS_SETTINGS_WIRELESS = 40, TV_MENU_NETWORK_WIRELESS_SETTINGS_NETWORKS = 41; public static final int WIRELESS_NETWORKS_CHANGED = 0, BUTTON_SCAN_ANIM = 1, BUTTON_CONNECTING_ANIM = 2; // fields for creating dialogs private ArrayList<ArrayList<Integer>> contentList = new ArrayList<ArrayList<Integer>>(), contentListIDs = new ArrayList<ArrayList<Integer>>(); private ArrayList<Integer> titleIDs = new ArrayList<Integer>(); private A4TVButton btnNetworks; private ListView listViewNetworks; private WirelessNetworksAdapter listAdapter; private int numberOfFoundedNetworks = 0; private Handler handlerForCallback; private INetworkSettings networkSettings; private Context ctx; private A4TVProgressDialog progressDialog; private A4TVToast toastFindWPS; // private A4TVAlertDialog alertDialog; private LayoutInflater inflater; private A4TVEditText editTextPassword; private WifiScanResult choosenScanResult; private WifiScanResult activeWiFiNetwork = null; private Thread thread; private Runnable run; private int textID = BUTTON_SCAN_ANIM; private String pin; public NetworkWirelessFindWPSDialog(Context context) { super(context, checkTheme(context), 0); ctx = context; // fill lists returnArrayListsWithDialogContents(contentList, contentListIDs, titleIDs); // set content to dialog fillDialog(); // set attributes setDialogAttributes(); init(); } @Override public void fillDialog() { listAdapter = new WirelessNetworksAdapter(); View view = DialogManager.dialogCreator.fillDialogWithContents( contentList, contentListIDs, titleIDs, null, this, listAdapter); setContentView(view); } @Override public void setDialogAttributes() { getWindow().getAttributes().width = MainActivity.dialogWidth; getWindow().getAttributes().height = MainActivity.dialogHeight; } /** * Function that load theme * * @param ctx * @return */ private static int checkTheme(Context ctx) { TypedArray atts = ctx.getTheme().obtainStyledAttributes( new int[] { R.attr.A4TVDialog }); int i = atts.getResourceId(0, 0); atts.recycle(); return i; } /** Init views in dialog */ private void init() { // get reference of views listViewNetworks = (ListView) findViewById(DialogCreatorClass.LIST_VIEW_IN_DIALOG_ID); listViewNetworks.setOnItemClickListener(this); btnNetworks = (A4TVButton) findViewById(TV_MENU_NETWORK_WIRELESS_SETTINGS_NETWORKS); toastFindWPS = new A4TVToast(ctx); progressDialog = new A4TVProgressDialog(MainActivity.activity); progressDialog.setCancelable(true); progressDialog.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { progressDialog.setTitleOfAlertDialog(R.string.cancel); try { MainActivity.service.getSystemControl() .getNetworkControl().cancelWps(); } catch (Exception e) { e.printStackTrace(); } // nemus:remove this once cancel wps callback is done progressDialog.dismiss(); return true; } return false; } }); /** Disable button networks */ disableBtn(btnNetworks, false); btnNetworks.setText(""); btnNetworks.setGravity(Gravity.LEFT); LinearLayout view = (LinearLayout) findViewById(R.string.tv_menu_network_wireless_settings_networks); if (view != null) { view.setPadding(4, 4, 15, 4); } /** Init handler */ handlerForCallback = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); } }; inflater = (LayoutInflater) ctx .getSystemService(Context.LAYOUT_INFLATER_SERVICE); run = new Runnable() { @Override public void run() { while (true) { Thread currentThread = Thread.currentThread(); if (currentThread.equals(thread)) { handlerForCallback.sendEmptyMessage(textID); try { Thread.sleep(400); } catch (InterruptedException e) { e.printStackTrace(); } } else { break; } } } }; } /** Disables button GUI representation */ private void disableBtn(A4TVButton btn, boolean focusable) { btn.setFocusable(focusable); btn.setBackgroundColor(Color.TRANSPARENT); } @Override public void show() { fillViews(); super.show(); } @Override public void onBackPressed() { NetworkSettingsDialog netSettDialog = MainActivity.activity .getDialogManager().getNetworkSettingsDialog(); if (netSettDialog != null) { netSettDialog.fillViews(); } super.onBackPressed(); } private void fillViews() { startThread(BUTTON_SCAN_ANIM); networkSettings = null; try { networkSettings = MainActivity.service.getSystemControl() .getNetworkControl(); } catch (Exception e) { e.printStackTrace(); } activeWiFiNetwork = null; try { if (networkSettings != null) { activeWiFiNetwork = networkSettings.getActiveWirelessNetwork(); } } catch (Exception e3) { e3.printStackTrace(); } // load networks numberOfFoundedNetworks = 0; try { if (networkSettings != null) { numberOfFoundedNetworks = networkSettings .getNumberOfAvailableWirelessNetworks(); activeWiFiNetwork = networkSettings.getActiveWirelessNetwork(); } } catch (Exception e) { e.printStackTrace(); } Log.d(MainActivity.TAG, "number Of Founded WiFi Networks: " + numberOfFoundedNetworks); listAdapter.notifyDataSetChanged(); } public void wirelessNetworksChanged(int state) { if (this.isShowing()) { switch (state) { case WirelessState.WIRELESS_STATE_OBTAINING_IP_ADDR: { { MainActivity.activity.runOnUiThread(new Runnable() { @Override public void run() { progressDialog .setTitleOfAlertDialog(R.string.connecting); } }); } break; } case WirelessState.WIRELESS_STATE_CONNECTED: { { MainActivity.activity.runOnUiThread(new Runnable() { @Override public void run() { progressDialog.dismiss(); toastFindWPS.showToast(R.string.connected); } }); } break; } default: break; } } } public void wpsStateChanged(int state) { if (this.isShowing()) { switch (state) { case WpsState.WPS_STATE_TIMED_OUT: { progressDialog.dismiss(); toastFindWPS .showToast(R.string.tv_menu_network_wps_timeout); break; } case WpsState.WPS_STATE_ERROR: { progressDialog.dismiss(); toastFindWPS.showToast(R.string.tv_menu_network_wps_error); break; } case WpsState.WPS_STATE_CANCEL_ERROR: case WpsState.WPS_STATE_CANCEL_SUCCESS: { progressDialog.dismiss(); toastFindWPS.showToast(R.string.tv_menu_network_wps_cancel); break; } default: break; } } } @Override public void onClick(View v) { switch (v.getId()) { default: break; } } @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { try { choosenScanResult = networkSettings.getWirelessNetwork(arg2); } catch (RemoteException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } progressDialog.setTitleOfAlertDialog("Attempting to register AP"); progressDialog.setMessage(R.string.please_wait); try { MainActivity.service .getSystemControl() .getNetworkControl() .startWpsPinRegistrar(pin, getScanResultBSSID(choosenScanResult)); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } progressDialog.show(); } private class WirelessNetworksAdapter extends BaseAdapter { private final int LIST_ITEM_WEIGHT_SUM = 5, TEXT_WEIGHT = 4, IMAGE_WEIGHT = 1; @Override public int getCount() { return numberOfFoundedNetworks; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = new LinearLayout(ctx); holder = new ViewHolder(); holder.textViewNetworkName = new A4TVTextView(ctx); holder.textViewDescription = new A4TVTextView(ctx); holder.image = new ImageView(ctx); holder.layoutForText = new LinearLayout(ctx); // add text to layout holder.layoutForText.addView(holder.textViewNetworkName); holder.layoutForText.addView(holder.textViewDescription); ((LinearLayout) convertView).addView(holder.layoutForText); ((LinearLayout) convertView).addView(holder.image); (convertView).setPadding(20, 2, 15, 2); ((LinearLayout) convertView) .setOrientation(LinearLayout.HORIZONTAL); ((LinearLayout) convertView) .setGravity(Gravity.CENTER_VERTICAL); ((LinearLayout) convertView).setWeightSum(LIST_ITEM_WEIGHT_SUM); convertView .setBackgroundResource(R.drawable.list_view_selector); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } setRow(holder, position); convertView.setLayoutParams(new ListView.LayoutParams( LayoutParams.MATCH_PARENT, (int) (MainActivity.dialogListElementHeight * 1.2))); return convertView; } /** Function that connects list views child with view holder */ private void setRow(ViewHolder holder, int position) { String text = ""; WifiScanResult scanResult = null; try { scanResult = networkSettings.getWirelessNetwork(position); } catch (Exception e4) { e4.printStackTrace(); } if (scanResult != null) { Log.d(TAG, "Initial text:" + text); // /////////////////////////////// // Fill text // /////////////////////////////// try { text = scanResult.getSSID(); } catch (Exception e3) { e3.printStackTrace(); } if (text != null) { holder.textViewNetworkName.setText(text); } // holder.textViewDescription.setText("WPS"); // ////////////////////////////// // Set text and layout params // ////////////////////////////// holder.layoutForText.setOrientation(LinearLayout.VERTICAL); holder.textViewNetworkName .setTextSize(MainActivity.dialogListElementHeight / 4); holder.textViewDescription .setTextSize(MainActivity.dialogListElementHeight / 4); // ///////////////////////////////////////////// // Set proper image on image view // ///////////////////////////////////////////// // check network strength int strength = 0; Log.d(TAG, "Initial strength value:" + strength); try { strength = checkNetworkStrength(scanResult.getLevel()); } catch (Exception e1) { e1.printStackTrace(); } // //////////////////////////////////// // If network is open // //////////////////////////////////// boolean openNetwork = true; try { openNetwork = getScanResultSecurity( networkSettings.getWirelessNetwork(position)) .equals("OPEN"); } catch (Exception e) { e.printStackTrace(); } setStrengthImageToImageView(strength, holder.image, openNetwork); holder.image.setLayoutParams(new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT, IMAGE_WEIGHT)); holder.layoutForText .setLayoutParams(new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT, TEXT_WEIGHT)); } } private class ViewHolder { ImageView image; TextView textViewNetworkName, textViewDescription; LinearLayout layoutForText; } } /** Is network open or password protected */ public static String getScanResultSecurity(WifiScanResult scanResult) { final String cap = scanResult.getCapabilities(); final String[] securityModes = { "WEP", "PSK", "EAP" }; for (int i = securityModes.length - 1; i >= 0; i--) { if (cap.contains(securityModes[i])) { return securityModes[i]; } } return "OPEN"; } public static String getScanResultBSSID(WifiScanResult scanResult) { return scanResult.getBSSID(); } /** Check network strength for wireless strength indicator */ public static int checkNetworkStrength(int strengthIndBm) { // bad signal if (strengthIndBm < -90) { return 0; } if (strengthIndBm < -65) { return 1; } if (strengthIndBm < -45) { return 2; } // good signal return 3; } /** Set wireless strength indicator */ public static void setStrengthImageToImageView(int strength, ImageView image, boolean openNetwork) { // open network if (openNetwork) { switch (strength) { case 0: { image.setImageResource(R.drawable.wireless_normal_0); break; } case 1: { image.setImageResource(R.drawable.wireless_normal_1); break; } case 2: { image.setImageResource(R.drawable.wireless_normal_2); break; } case 3: { image.setImageResource(R.drawable.wireless_normal_3); break; } default: break; } } // password protected network else { switch (strength) { case 0: { image.setImageResource(R.drawable.wireless_locked_0); break; } case 1: { image.setImageResource(R.drawable.wireless_locked_1); break; } case 2: { image.setImageResource(R.drawable.wireless_locked_2); break; } case 3: { image.setImageResource(R.drawable.wireless_locked_3); break; } default: break; } } } @Override public void returnArrayListsWithDialogContents( ArrayList<ArrayList<Integer>> contentList, ArrayList<ArrayList<Integer>> contentListIDs, ArrayList<Integer> titleIDs) { // clear old data in lists contentList.clear(); contentListIDs.clear(); titleIDs.clear(); // title titleIDs.add(R.drawable.settings_icon); titleIDs.add(R.drawable.network); titleIDs.add(R.string.tv_menu_network_wireless_settings); ArrayList<Integer> list = new ArrayList<Integer>(); list.add(MainMenuContent.TAGA4TVTextView); list.add(MainMenuContent.TAGA4TVButton); contentList.add(list); list = new ArrayList<Integer>(); list.add(R.string.tv_menu_network_wireless_settings_networks); list.add(TV_MENU_NETWORK_WIRELESS_SETTINGS_NETWORKS); contentListIDs.add(list); } /** * Start background thread * * @param run * Runnable to run in thread */ public void startThread(int animType) { Log.d(MainActivity.TAG, "start thread entered"); if (thread == null) { if (BUTTON_SCAN_ANIM == animType) { btnNetworks.setText(R.string.scaning); } else { btnNetworks.setText(R.string.connecting); } textID = animType; thread = new Thread(run); thread.setPriority(Thread.MIN_PRIORITY); thread.start(); } } /** * Stops background thread */ public void stopThread() { Log.d(MainActivity.TAG, "stop thread entered"); if (thread != null) { Thread moribund = thread; thread = null; moribund.interrupt(); new Handler().postDelayed(new Runnable() { @Override public void run() { btnNetworks.setText(""); } }, 400); } } public A4TVButton getBtnNetworks() { return btnNetworks; } public String getPin() { return pin; } public void setPin(String pin) { this.pin = pin; } }