김중헌 졸업논문/ 소스코드 - 6월 5일

Retired DISLab
이동: 둘러보기, 찾기

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();
	}
}
개인 도구
이름공간
변수
행위
둘러보기
구성원
연구
연구실
기타
도구모음
인쇄/내보내기