/* SettingFragment.java Copyright (c) 2016 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.app.simplebot.fragment; import android.app.AlertDialog; import android.app.Fragment; import android.app.ProgressDialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.PowerManager; import android.provider.Settings; 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.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.Switch; import org.deviceconnect.android.app.simplebot.R; import org.deviceconnect.android.app.simplebot.SimpleBotService; import org.deviceconnect.android.app.simplebot.data.SettingData; import org.deviceconnect.android.app.simplebot.utils.DConnectHelper; import org.deviceconnect.android.app.simplebot.utils.Utils; import java.util.ArrayList; import java.util.List; /** * 設定画面 */ public class SettingFragment extends Fragment implements ShowMenuFragment { /** 選択サービス */ private DConnectHelper.ServiceInfo selectedInfo = null; /** サービス停止のレシーバー */ private BroadcastReceiver receiver; /** メニュー */ private Menu mainMenu; private Switch switchStatus; private EditText editTextHost; private EditText editTextPort; private CheckBox checkBoxSSL; private Button buttonService; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public void onDestroy() { super.onDestroy(); } @Override public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) { setHasOptionsMenu(true); final View view = inflater.inflate(R.layout.fragment_setting, container, false); final Context context = view.getContext(); switchStatus = (Switch)view.findViewById(R.id.switchStatus); editTextHost = (EditText)view.findViewById(R.id.editTextHost); editTextPort = (EditText)view.findViewById(R.id.editTextPort); checkBoxSSL = (CheckBox)view.findViewById(R.id.checkBoxSSL); buttonService = (Button)view.findViewById(R.id.buttonService); // サービス停止のレシーバー登録 receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // チェックを入れていたのにサービスが止まった時はエラーメッセージ表示 if (switchStatus.isChecked()) { // エラーメッセージ Utils.showAlertDialog(context, getString(R.string.err_occurred)); // チェックを外す switchStatus.setChecked(false); // UI更新 SettingData setting = SettingData.getInstance(getActivity()); changeEnabled(setting); } } }; final IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(SimpleBotService.SERVICE_STOP_ACTION); getActivity().registerReceiver(receiver, intentFilter); // サービス選択ボタンイベント buttonService.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 設定保存 saveSettings(); // サービス取得 fetchServices(context); } }); // ステータススイッチイベント switchStatus.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (selectedInfo != null) { // 保存 saveSettings(); Intent serviceIntent = new Intent(context, SimpleBotService.class); if (switchStatus.isChecked()) { // サービス開始 context.startService(serviceIntent); } else { // サービス停止 context.stopService(serviceIntent); } } else { if (switchStatus.isChecked()) { // エラーメッセージ Utils.showAlertDialog(context, getString(R.string.service_not_selected)); // チェックを外す switchStatus.setChecked(false); } } } }); // 設定読み込み loadSettings(); return view; } @Override public void onDestroyView() { super.onDestroyView(); // レシーバー解除 getActivity().unregisterReceiver(receiver); } @Override public void onResume() { super.onResume(); getActivity().setTitle(getString(R.string.app_name) + " [設定]"); refreshDozePermission(getView()); } private void refreshDozePermission(final View view) { View dozeView = view.findViewById(R.id.doze_layout); if (dozeView != null) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { PowerManager mgr = getActivity().getSystemService(PowerManager.class); if (!mgr.isIgnoringBatteryOptimizations(getActivity().getPackageName())) { Button dozeBtn = (Button) view.findViewById(R.id.doze_btn); if (dozeBtn != null) { dozeBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS); intent.setData(Uri.parse("package:" + getActivity().getPackageName())); getActivity().startActivity(intent); } } }); } dozeView.setVisibility(View.VISIBLE); } else { dozeView.setVisibility(View.GONE); } } else { dozeView.setVisibility(View.GONE); } } } /** * 設定読み込み */ private void loadSettings() { SettingData setting = SettingData.getInstance(getActivity()); editTextHost.setText(setting.host); editTextPort.setText(String.valueOf(setting.port)); checkBoxSSL.setChecked(setting.ssl); switchStatus.setChecked(setting.active); if (setting.serviceId != null) { selectedInfo = new DConnectHelper.ServiceInfo(setting.serviceId, setting.serviceName, null); buttonService.setText(selectedInfo.name); } // UI更新 changeEnabled(setting); } /** * 設定保存 */ private void saveSettings() { SettingData setting = SettingData.getInstance(getActivity()); setting.host = editTextHost.getText().toString(); String port = editTextPort.getText().toString(); if (port.length() > 0) { setting.port = Integer.parseInt(port); } setting.ssl = checkBoxSSL.isChecked(); setting.active = switchStatus.isChecked(); if (selectedInfo != null) { setting.serviceId = selectedInfo.id; setting.serviceName = selectedInfo.name; } setting.save(); // UI更新 changeEnabled(setting); } /** * UI使用可能を切り替える */ private void changeEnabled(SettingData setting) { editTextHost.setEnabled(!setting.active); editTextPort.setEnabled(!setting.active); checkBoxSSL.setEnabled(!setting.active); buttonService.setEnabled(!setting.active); } /** * サービス一覧を取得 * @param context context */ private void fetchServices(final Context context) { // プログレスダイアログを表示 final ProgressDialog dialog = Utils.showProgressDialog(context); // サービス取得 Utils.fetchServices(context, new DConnectHelper.FinishCallback<List<DConnectHelper.ServiceInfo>>() { @Override public void onFinish(final List<DConnectHelper.ServiceInfo> serviceInfos, final Exception error) { // プログレスダイアログを閉じる dialog.dismiss(); getActivity().runOnUiThread(new Runnable() { @Override public void run() { checkFetchServices(serviceInfos, error, context); } }); } }); } private void checkFetchServices(List<DConnectHelper.ServiceInfo> serviceInfos, Exception error, Context context) { if (error == null) { // messageHookに対応しているサービスを選別 final List<DConnectHelper.ServiceInfo> services = new ArrayList<>(); for (DConnectHelper.ServiceInfo service : serviceInfos) { if (service.scopes != null) { for (String scope : service.scopes) { if ("messageHook".equalsIgnoreCase(scope)) { services.add(service); break; } } } } if (services.size() > 0) { // 選択ダイアログ表示 String items[] = new String[services.size()]; for (int i = 0; i < services.size(); i++) { items[i] = services.get(i).name; } new AlertDialog.Builder(context) .setTitle(getString(R.string.select_service)) .setItems(items, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 情報取得 selectedInfo = services.get(which); buttonService.setText(selectedInfo.name); } }).show(); } else { selectedInfo = null; buttonService.setText(getString(R.string.unset)); Utils.showAlertDialog(context, getString(R.string.service_not_found_and_install)); } } else { // エラー処理 Utils.showErrorDialog(context, error); } } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_list_command: Fragment fragment = new CommandListFragment(); Utils.transition(fragment, getFragmentManager(), true); break; case R.id.menu_list_result: fragment = new ResultListFragment(); Utils.transition(fragment, getFragmentManager(), true); break; } return super.onOptionsItemSelected(item); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.main_menu, menu); mainMenu = menu; } /** * メニューを表示 */ public void showMenu() { mainMenu.performIdentifierAction(R.id.overflow_options, 0); } }