김중헌 졸업논문/ 소스코드 - 6월 5일
Retired DISLab
(버전 사이의 차이)
(새 문서: *: image:classDiagram 6.2.jpg ==== OnGetUserListListener.java ==== <source lang = "java"> package hufs.dislab.gae.userManager; import java.util.List; import android.content.Co...) |
|||
1번째 줄: | 1번째 줄: | ||
− | *: [[image:classDiagram 6. | + | *: [[image:classDiagram 6.5.jpg]] |
==== OnGetUserListListener.java ==== | ==== OnGetUserListListener.java ==== |
2014년 6월 5일 (목) 13:57 현재 판
OnGetUserListListener.java
package hufs.dislab.gae.userManager; import java.util.List; import android.content.Context; import android.view.View; public abstract class onGetUserListListener { public Context context; public View view; public List<User> list; public onGetUserListListener(Context context, View view) { this.context = context; this.view = view; this.list = UserManager.getUserManager(null).getList(); } abstract public void onGetUserList(); // private void addUser(User user) { // list.add(user); // } }
UserManager.java
public class UserManager { private static UserManager um; public List<User> userList; public List<User> nearbyUserList; private Context context; private int userCnt = 0; private NfcAdapter nfcAdapter; private PendingIntent pendingIntent; String REGI_ID = ""; String SENDER_ID = "508815197180"; private static String tagID = null; private BluetoothAdapter myBluetoothAdapter; public String selectedMacAddr = ""; BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter(); String MACaddr = bluetooth.getAddress(); public void increaseUserCnt() { userCnt++; } private UserManager(Context context) { userList = new LinkedList<User>(); this.context = context; } public static UserManager getUserManager(Context context) { if (um == null) { um = new UserManager(context); } return um; } public synchronized void addUser(String name, String number, String MACaddr, String regId) { userList.add(new User(name, number, MACaddr, regId)); userCnt++; } public void addNearbyUser(String name, String number, String MACaddr, String regId) { nearbyUserList.add(new User(name, number, MACaddr, regId)); } public int numberOfUsers() { return userCnt; } public boolean isUserEmpty() { if(userCnt == 0){ return true; } else{ return false; } } private synchronized boolean checkDuplicationByPhoneNumber(String phoneNumber) { for (User u : userList) { if (u.getNumber().equals(phoneNumber)) return true; } return false; } /** * userList를 반환한다. ul라는 자원을 동시에 접근하지 못하도록 관련된 함수들은 모두 synchronized로 선언 * @return */ public synchronized List<User> getList() { return userList; } /** * 블루투스 전원 키기 */ public void turnOnBluetooth() { if (!myBluetoothAdapter.isEnabled()) { myBluetoothAdapter.enable(); Toast.makeText(UserManager.getUserManager(null).context.getApplicationContext(), "Bluetooth turned on", Toast.LENGTH_LONG).show(); } else { Toast.makeText(UserManager.getUserManager(null).context.getApplicationContext(), "Bluetooth is already on", Toast.LENGTH_LONG).show(); } } /** * 블루투스 전원 끄기 */ public void turnOffBluetooth() { myBluetoothAdapter.disable(); Toast.makeText(UserManager.getUserManager(null).context.getApplicationContext(), "Bluetooth turned off", Toast.LENGTH_LONG).show(); } /** * 사용자의 정보를 등록하는 함수 * 이름은 변수이기 때문에 인자 값으로 넣어서 휴대폰 번호, MAC주소, regId와 함께 앱 엔진에 post 방식으로 보낸다 * 스레드를 사용하기 때문에 스레드가 끝날 때 listener를 통해 알림을 준다. * @param name */ public void registerUserData(final String name, final onGetUserListListener listener) { issueRegId(); new Thread(new Runnable() { @Override public void run() { String url = "http://hunny123234.appspot.com/sign"; HttpClient http = new DefaultHttpClient(); TelephonyManager phoneMgr = (TelephonyManager) UserManager .getUserManager(null).context.getApplicationContext() .getSystemService(Context.TELEPHONY_SERVICE); String number = phoneMgr.getLine1Number(); BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter(); String MACaddr = bluetooth.getAddress(); try { ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(new BasicNameValuePair("name", name)); nameValuePairs.add(new BasicNameValuePair("regId", REGI_ID)); nameValuePairs.add(new BasicNameValuePair("number", number)); nameValuePairs.add(new BasicNameValuePair("MACaddr", MACaddr)); HttpPost httpPost = new HttpPost(url); UrlEncodedFormEntity entityRequest = new UrlEncodedFormEntity( nameValuePairs, "UTF-8"); httpPost.setEntity(entityRequest); http.execute(httpPost); } catch (Exception e) { e.printStackTrace(); } listener.onGetUserList(); } }).start(); } private void issueRegId() { new AsyncTask<Void, String, String>() { @Override protected String doInBackground(Void... params) { GoogleCloudMessaging gcm = GoogleCloudMessaging .getInstance(UserManager.getUserManager(null).context .getApplicationContext()); try { REGI_ID = gcm.register(SENDER_ID); Log.d("REGISTRATION", REGI_ID); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); Log.e("REGISTRATION", e.toString()); } gcm.close(); return null; } }.execute(null, null, null); } /** * 리스트뷰에서 아이템을 클릭했을 때 해당 아이템의 MAC주소를 반환하는 onItemClick 이벤트 처리 예시이다. * 이를 활용하면 변수 selectedMacAddr에 선택한 Item의 MAC주소가 반환된다. * @author KimJungheon * */ // public class getListViewItemMACaddr implements AdapterView.OnItemClickListener { // // ArrayList<String> items = null; // // public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // selectedMacAddr = items.get(position); // } // } /** * * @param MACaddr * @return 클릭한 아이템의 mac주소를 가지고 있는지 확인 후 있다면 (이름/휴대폰번호) 리스트뷰에 띄워줌. 없다면 토스트 메시지 출력 */ public String[] getSelectedUserNameNumber(String MACaddr) { User selectedUser = UserManager.getUserManager(null).getUserFromMACaddr(MACaddr); //if there is user having MACaddr if (selectedUser != null) { String[] selectedUserList = new String[1]; for (int i = 0; i < selectedUserList.length; i++) { selectedUserList[i] = selectedUser.toString(); } return selectedUserList; //there is no user having MACaddr } else { Toast.makeText(UserManager.getUserManager(null).context, "No device in Datastore", Toast.LENGTH_SHORT).show(); } return null; } private synchronized User getUserFromMACaddr(String addr) { for (User u : userList) { if (u.getMACAddr().equals(addr)) { return u; } else { continue; } } return null; } public abstract class Scanner { public abstract List<User> detection(); } /** * abstract 클래스인 Scanner를 상속받아서 Bluetooth detection * 주변 사용자 목록인 nearByUserList를 반환한다. * @author KimJungheon * */ public class BluetoothScanner extends Scanner { @Override public List<User> detection() { if (myBluetoothAdapter.isDiscovering()) { // when it discovers, so cancel the discovery myBluetoothAdapter.cancelDiscovery(); } else { // BTArrayAdapter.clear(); myBluetoothAdapter.startDiscovery(); UserManager.getUserManager(null).context.registerReceiver(bReceiver, new IntentFilter(BluetoothDevice.ACTION_FOUND)); } return null; } } /** * 브로드캐스트리시버를 통해 검출된 NAC주소와 일치하는 사용자의 정보를 nearByUserList에 add한다. */ final BroadcastReceiver bReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); // When discovery finds a device if (BluetoothDevice.ACTION_FOUND.equals(action)) { // Get the BluetoothDevice object from the Intent BluetoothDevice device = intent .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); // add the name and the MAC address of the object to the // arrayAdapter MACaddr = device.getAddress(); for (User u : userList) { if (u.getMACAddr().equals(MACaddr)) { UserManager.getUserManager(null).addNearbyUser(u.getName(), u.getNumber(), MACaddr, u.getRegId()); } } } } }; /** * NFC 검출부분은 아직 미완성입니다. * @author KimJungheon * */ public class NFCScanner extends Scanner { @Override public List<User> detection() { Intent intent = new Intent(); Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); byte[] tagId = tag.getId(); tagID = toHexString(tagId); return nearbyUserList; } } public static final String CHARS = "0123456789ABCDEF"; public static String toHexString(byte[] data) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < data.length; ++i) { sb.append(CHARS.charAt((data[i] >> 4) & 0x0F)) .append(CHARS.charAt(data[i] & 0x0F)); } return sb.toString(); } /** * 네트워크 프로그래밍을 하는 연산을 마친 뒤 userList를 만든다. * try를 모두 마치면 스레드를 끝내기 전에 listener.onGetUserList()를 호출(?)하여 userList 접근가능을 알린다. * @param listener */ public void getUserList(final onGetUserListListener listener) { new Thread(new Runnable() { @Override public void run() { try { String getURL = "http://hunny123234.appspot.com"; HttpClient client = new DefaultHttpClient(); HttpGet get = new HttpGet(getURL); HttpResponse responseGet = client.execute(get); HttpEntity resEntityGet = responseGet.getEntity(); if (resEntityGet != null) { // process result String temp = EntityUtils.toString(resEntityGet); for (String line : temp.split("\n")) { String[] split = line.split("&"); for (int i = 0; i < split.length - 3; i += 4) { if (!UserManager.getUserManager(null).checkDuplicationByPhoneNumber(split[i + 1])) addUser(split[i], split[i+1], split[i+2], split[i+3]); } } } //userList 생성완료 } catch (NullPointerException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { } listener.onGetUserList(); //listener를 통해 스레드 끝남을 알림 } }).start(); } }