/*
HueFragment01
Copyright (c) 2014 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.deviceplugin.hue.activity.fragment;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import com.philips.lighting.hue.sdk.PHAccessPoint;
import com.philips.lighting.hue.sdk.PHBridgeSearchManager;
import com.philips.lighting.hue.sdk.PHHueSDK;
import com.philips.lighting.hue.sdk.PHMessageType;
import com.philips.lighting.hue.sdk.PHSDKListener;
import com.philips.lighting.model.PHBridge;
import com.philips.lighting.model.PHHueParsingError;
import org.deviceconnect.android.deviceplugin.hue.R;
import java.util.List;
/**
* Hue設定画面(1)フラグメント.
*/
public class HueFragment01 extends Fragment implements OnClickListener, OnItemClickListener {
/** ListViewのAdapter. */
private CustomAdapter mAdapter;
/** ProgressZone. */
private View mProgressView;
/** 再検索ボタン. */
private Button mSearchButton;
/**
* hueブリッジのNotificationを受け取るためのリスナー.
*/
private PHSDKListener mListener = new PHSDKListener() {
@Override
public void onAuthenticationRequired(final PHAccessPoint accessPoint) {
}
@Override
public void onAccessPointsFound(final List<PHAccessPoint> accessPoint) {
runOnUiThread(new Runnable() {
@Override
public void run() {
PHHueSDK hueSDK = PHHueSDK.getInstance();
mAdapter.updateData(hueSDK.getAccessPointsFound());
mProgressView.setVisibility(View.GONE);
mSearchButton.setVisibility(View.VISIBLE);
}
});
}
@Override
public void onCacheUpdated(final List<Integer> list, final PHBridge bridge) {
}
@Override
public void onBridgeConnected(final PHBridge phBridge, final String userName) {
}
@Override
public void onConnectionLost(final PHAccessPoint point) {
}
@Override
public void onConnectionResumed(final PHBridge bridge) {
}
@Override
public void onError(final int code, final String message) {
if (code == PHMessageType.BRIDGE_NOT_FOUND) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mProgressView.setVisibility(View.GONE);
mSearchButton.setVisibility(View.VISIBLE);
}
});
}
}
@Override
public void onParsingErrors(final List<PHHueParsingError> error) {
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@SuppressLint("InflateParams")
@Override
public View onCreateView(final LayoutInflater inflater,
final ViewGroup container, final Bundle savedInstanceState) {
PHHueSDK hueSDK = PHHueSDK.getInstance();
View rootView = inflater.inflate(R.layout.hue_fragment_01, container, false);
if (rootView != null) {
mSearchButton = (Button) rootView.findViewById(R.id.btnRefresh);
mSearchButton.setOnClickListener(this);
mProgressView = rootView.findViewById(R.id.progress_zone);
mProgressView.setVisibility(View.VISIBLE);
mAdapter = new CustomAdapter(getActivity().getBaseContext(), hueSDK.getAccessPointsFound());
ListView listView = (ListView) rootView.findViewById(R.id.bridge_list2);
listView.setOnItemClickListener(this);
View headerView = inflater.inflate(R.layout.hue_fragment_01_header, null, false);
listView.addHeaderView(headerView, null, false);
listView.setAdapter(mAdapter);
}
return rootView;
}
@Override
public void onResume() {
super.onResume();
// Hueのインスタンスの取得.
PHHueSDK phHueSDK = PHHueSDK.getInstance();
// HueブリッジからのCallbackを受け取るためのリスナーを登録.
phHueSDK.getNotificationManager().registerSDKListener(mListener);
if (isWifiEnabled()) {
// ローカルBridgeのUPNP Searchを開始する.
doBridgeSearch();
} else {
mProgressView.setVisibility(View.GONE);
mSearchButton.setVisibility(View.VISIBLE);
showWifiNotConnected();
}
}
@Override
public void onPause() {
// リスナーを解除
PHHueSDK phHueSDK = PHHueSDK.getInstance();
phHueSDK.getNotificationManager().unregisterSDKListener(mListener);
super.onPause();
}
@Override
public void onClick(final View v) {
// 検索処理を再度実行.
if (isWifiEnabled()) {
doBridgeSearch();
} else {
showWifiNotConnected();
}
}
@Override
public void onItemClick(final AdapterView<?> parent, final View view, final int position, final long id) {
moveNextFragment((PHAccessPoint) mAdapter.getItem(position));
}
private void runOnUiThread(final Runnable run) {
final Activity activity = getActivity();
if (activity != null) {
activity.runOnUiThread(run);
}
}
/**
* ローカルBridgeのUPNP Searchを開始する.
*/
private void doBridgeSearch() {
PHHueSDK hueSDK = PHHueSDK.getInstance();
// アクセスポイントのキャッシュクリア
hueSDK.getAccessPointsFound().clear();
// アクセスポイントリストビューのクリア
mAdapter.updateData(hueSDK.getAccessPointsFound());
// ローカルBridgeのUPNP Searchを開始
PHBridgeSearchManager sm = (PHBridgeSearchManager) hueSDK.getSDKService(PHHueSDK.SEARCH_BRIDGE);
sm.search(true, true);
runOnUiThread(new Runnable() {
@Override
public void run() {
mProgressView.setVisibility(View.VISIBLE);
mSearchButton.setVisibility(View.GONE);
}
});
}
/**
* Wi-Fi接続が無効になっている場合のエラーダイアログを表示します.
*/
private void showWifiNotConnected() {
final Activity activity = getActivity();
if (activity != null) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
new AlertDialog.Builder(getActivity())
.setTitle(R.string.hue_dialog_network_error)
.setMessage(R.string.hue_dialog_not_connect_wifi)
.setPositiveButton(R.string.hue_dialog_ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(final DialogInterface dialog, final int which) {
}
})
.setCancelable(false)
.show();
}
});
}
}
/**
* 指定されたアクセスポイントを指定して、次のフラグメントを開く.
* @param accessPoint アクセスポイント
*/
private void moveNextFragment(final PHAccessPoint accessPoint) {
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.setCustomAnimations(R.anim.fragment_slide_right_enter, R.anim.fragment_slide_left_exit,
R.anim.fragment_slide_left_enter, R.anim.fragment_slide_right_exit);
transaction.replace(R.id.fragment_frame, HueFragment02.newInstance(accessPoint));
transaction.commit();
}
/**
* Wi-Fi接続設定の状態を取得します.
* @return trueの場合は有効、それ以外の場合は無効
*/
private boolean isWifiEnabled() {
WifiManager mgr = (WifiManager) getActivity().getApplicationContext().getSystemService(Context.WIFI_SERVICE);
return mgr.isWifiEnabled();
}
/**
* カスタムAdapter.
*/
private class CustomAdapter extends BaseAdapter {
/** コンテキスト. */
private final Context mContext;
/** Access Point. */
private List<PHAccessPoint> mAccessPoints;
/**
* コンストラクタ.
*
* @param context コンテキスト
* @param accessPoints Access Point
*/
CustomAdapter(final Context context, final List<PHAccessPoint> accessPoints) {
mContext = context;
mAccessPoints = accessPoints;
}
/**
* Access Pointリストのアップデートを行う.
*
* @param accessPoints Access Point
*/
private void updateData(final List<PHAccessPoint> accessPoints) {
mAccessPoints = accessPoints;
notifyDataSetChanged();
}
@SuppressLint("ViewHolder")
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.hue_list, parent, false);
TextView mTextView = (TextView) rowView.findViewById(R.id.row_textview1);
String listTitle = mAccessPoints.get(position).getMacAddress() + "("
+ mAccessPoints.get(position).getIpAddress() + ")";
mTextView.setText(listTitle);
return rowView;
}
@Override
public int getCount() {
return mAccessPoints.size();
}
@Override
public Object getItem(final int position) {
return mAccessPoints.get(position - 1);
}
@Override
public long getItemId(final int position) {
return 0;
}
}
}