/* AWSIoTManagerListFragment.java Copyright (c) 2016 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.deviceplugin.awsiot.setting.fragment; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.DialogFragment; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.Switch; import org.deviceconnect.android.deviceplugin.awsiot.cores.core.AWSIotDeviceApplication; import org.deviceconnect.android.deviceplugin.awsiot.cores.core.AWSIotPrefUtil; import org.deviceconnect.android.deviceplugin.awsiot.cores.core.RDCMListManager; import org.deviceconnect.android.deviceplugin.awsiot.cores.core.RemoteDeviceConnectManager; import org.deviceconnect.android.deviceplugin.awsiot.local.DConnectHelper; import org.deviceconnect.android.deviceplugin.awsiot.remote.R; import org.deviceconnect.android.deviceplugin.awsiot.setting.AWSIotSettingActivity; import org.deviceconnect.message.DConnectMessage; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.List; import java.util.UUID; /** * AWS Iot Manager List Fragment. * * @author NTT DOCOMO, INC. */ public class AWSIotManagerListFragment extends Fragment { /** LOG Tag */ private static final String TAG = AWSIotManagerListFragment.class.getCanonicalName(); /** * Manager error type. */ private enum ErrorManagerType { /** * No error. */ NONE, /** * Manager off. */ MANAGER_OFF, /** * Manager old. */ MANAGER_OLD, /** * Unauthorized "aws" device plug-in's setting. */ UNAUTHORIZED } /** * Menu Response. */ private interface OnMenuResponse { /** * On response. */ void onResponse(); } /** Adapter. */ private ManagerAdapter mManagerAdapter; /** Instance of {@link RDCMListManager}. */ private RDCMListManager mRDCMListManager; /** Device Connect Manager enable flag. */ private ErrorManagerType mMyManagerEnable = ErrorManagerType.NONE; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { setHasOptionsMenu(true); /* Instance of {@link AWSIotDeviceApplication}. */ AWSIotDeviceApplication app = (AWSIotDeviceApplication) getContext().getApplicationContext(); mRDCMListManager = app.getRDCMListManager(); ManagerListUpdateDialogFragment dialog = new ManagerListUpdateDialogFragment(); dialog.show(getFragmentManager(),"AvailabilityDialog"); getSystem(); List<RemoteDeviceConnectManager> managers = new ArrayList<>(); mManagerAdapter = new ManagerAdapter(getActivity(), managers); View rootView = inflater.inflate(R.layout.settings_manager_list, null); ListView listView = (ListView) rootView.findViewById(R.id.manager_list_view); listView.setAdapter(mManagerAdapter); Button btn = (Button) rootView.findViewById(R.id.button_awsiot_sync); btn.setAllCaps(false); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getManagerList(); } }); return rootView; } @Override public void onResume() { super.onResume(); getManagerList(); } @Override public void onDestroyView() { super.onDestroyView(); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu, menu); super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { FragmentManager manager = getActivity().getSupportFragmentManager(); final FragmentTransaction transaction = manager.beginTransaction(); boolean ret = true; switch (item.getItemId()) { case R.id.menu_awsiot_info: checkManagerState(new OnMenuResponse() { @Override public void onResponse() { AWSIotInformationFragment infoFragment = new AWSIotInformationFragment(); transaction.add(R.id.container, infoFragment); transaction.addToBackStack("ManagerList"); transaction.commit(); } }); break; case R.id.menu_device_auth: checkManagerState(new OnMenuResponse() { @Override public void onResponse() { AWSIotDeviceAuthenticationFragment deviceAuthFragment = new AWSIotDeviceAuthenticationFragment(); transaction.add(R.id.container, deviceAuthFragment); transaction.addToBackStack("ManagerList"); transaction.commit(); } }); break; case R.id.menu_logout: AWSIotDeviceApplication.getInstance().logoutAWSIot(); // ログイン画面へ遷移 AWSIotLoginFragment loginFragment = new AWSIotLoginFragment(); transaction.replace(R.id.container, loginFragment); transaction.commit(); break; default: ret = super.onOptionsItemSelected(item); break; } return ret; } private void checkManagerState(final OnMenuResponse response) { if (mMyManagerEnable == ErrorManagerType.MANAGER_OLD) { showManagerCheckDialog(R.string.setting_manager_old_warning); } else if (mMyManagerEnable == ErrorManagerType.UNAUTHORIZED) { getSystem(); } else if (mMyManagerEnable == ErrorManagerType.MANAGER_OFF){ showManagerCheckDialog(R.string.setting_manager_off_warning); } else { response.onResponse(); } } private void getManagerList() { ManagerListUpdateDialogFragment dialog = new ManagerListUpdateDialogFragment(); dialog.show(getFragmentManager(),"ManagerListDialog"); mRDCMListManager.updateManagerList(new RDCMListManager.UpdateManagerListCallback() { @Override public void onUpdateManagerList(final List<RemoteDeviceConnectManager> managerList) { mManagerAdapter.clear(); mManagerAdapter.addAll(mRDCMListManager.getRDCMList()); mManagerAdapter.notifyDataSetInvalidated(); ManagerListUpdateDialogFragment dialog = (ManagerListUpdateDialogFragment) getFragmentManager().findFragmentByTag("ManagerListDialog"); if (dialog != null) { dialog.dismiss(); } } }); } private class ManagerAdapter extends ArrayAdapter<RemoteDeviceConnectManager> { private LayoutInflater mInflater; public ManagerAdapter(final Context context, final List<RemoteDeviceConnectManager> objects) { super(context, 0, objects); mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public View getView(final int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = mInflater.inflate(R.layout.item_manager, null); } final RemoteDeviceConnectManager manager = getItem(position); String name = manager.getName(); Switch sw = (Switch) convertView.findViewById(R.id.manager_switch_onoff); sw.setText(name); if (manager.isSubscribe()) { sw.setChecked(true); } else { sw.setChecked(false); } sw.setOnClickListener(new View.OnClickListener() { @Override public void onClick(final View v) { if (manager.isSubscribe()) { // DB変更処理(flag = false) mRDCMListManager.updateSubscribe(manager.getServiceId(), false); manager.setSubscribeFlag(false); // ボタン変更 Switch sw = (Switch) v.findViewById(R.id.manager_switch_onoff); sw.setChecked(false); } else { // DB変更処理(flag = true) mRDCMListManager.updateSubscribe(manager.getServiceId(), true); manager.setSubscribeFlag(true); // ボタン変更 Switch sw = (Switch) v.findViewById(R.id.manager_switch_onoff); sw.setChecked(true); } } }); return convertView; } } private void getSystem() { DConnectHelper.INSTANCE.getSystem(new DConnectHelper.FinishCallback() { @Override public void onFinish(String response, Exception error) { ManagerListUpdateDialogFragment dialog = (ManagerListUpdateDialogFragment) getFragmentManager().findFragmentByTag("AvailabilityDialog"); if (response == null) { if (dialog != null) { dialog.dismiss(); } Log.d("TEST", "null"); return; } try { JSONObject jsonObject = new JSONObject(response); int result = jsonObject.getInt("result"); int errorCode = -1; if (result == DConnectMessage.RESULT_ERROR) { errorCode = jsonObject.getInt("errorCode"); } if (result == 0) { mMyManagerEnable = ErrorManagerType.NONE; AWSIotPrefUtil pref = ((AWSIotSettingActivity) getContext()).getPrefUtil(); String name = jsonObject.optString("name"); String uuid = jsonObject.optString("uuid"); if (name == null || uuid == null || (name != null && name.length() == 0) || (uuid != null && uuid.length() == 0)) { mMyManagerEnable = ErrorManagerType.MANAGER_OLD; if (dialog != null) { dialog.dismiss(); } showManagerCheckDialog(R.string.setting_manager_old_warning); return; } pref.setManagerName(name); pref.setManagerUuid(uuid); } else if (errorCode == DConnectMessage.ErrorCode.AUTHORIZATION.getCode()) { mMyManagerEnable = ErrorManagerType.UNAUTHORIZED; showManagerCheckDialog(R.string.setting_manager_auth_warning); } else { mMyManagerEnable = ErrorManagerType.MANAGER_OFF; showManagerCheckDialog(R.string.setting_manager_off_warning); } } catch (JSONException e) { Log.e(TAG, "", e); } if (dialog != null) { dialog.dismiss(); } } }); } /** * Show a dialog of manager list update. */ public static class ManagerListUpdateDialogFragment extends DialogFragment { @NonNull @Override public Dialog onCreateDialog(final Bundle savedInstanceState) { String msg = getString(R.string.manager_list_update); ProgressDialog progressDialog = new ProgressDialog(getActivity()); progressDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); progressDialog.setMessage(msg); progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); setCancelable(false); return progressDialog; } @Override public void onPause() { dismiss(); super.onPause(); } } private void showManagerCheckDialog(final int messageResource) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(R.string.setting_confirm_title) .setMessage(messageResource) .setPositiveButton(R.string.webview_js_alert_positive_btn, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // No Operation. } }); builder.show(); } }