/*
SettingFragment.java
Copyright (c) 2016 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.deviceplugin.slackmessagehook.setting.fragment;
import android.app.Fragment;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
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.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.Switch;
import android.widget.TextView;
import org.deviceconnect.android.deviceplugin.slackmessagehook.R;
import org.deviceconnect.android.deviceplugin.slackmessagehook.slack.SlackManager;
/**
* 設定画面用Fragment.
*
* @author NTT DOCOMO, INC.
*/
public class SettingFragment extends Fragment implements SlackManager.SlackEventListener, ShowMenuFragment {
/** メニュー */
private Menu mainMenu;
/** Switchの設定変更イベントリスナー */
private View.OnClickListener onClickListener;
/** 回転時の画面切り替え用にrootを保持しておく */
private FrameLayout rootLayout;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// メニュー対応
setHasOptionsMenu(true);
// Slackイベントを受け取る
SlackManager.INSTANCE.addSlackEventListener(this);
// View作成
View view = initView();
rootLayout = new FrameLayout(view.getContext());
rootLayout.addView(view);
return rootLayout;
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// 画面回転時にレイアウトを作り直す
rootLayout. removeAllViews();
View view = initView();
rootLayout.addView(view);
}
@Override
public void onDestroyView() {
super.onDestroyView();
// Slackイベントを受け取り解除
SlackManager.INSTANCE.removeSlackEventListener(this);
}
@Override
public void onResume() {
super.onResume();
refreshStatus(getView());
refreshDozePermission(getView());
}
@Override
public void onStop() {
super.onStop();
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.clear();
inflater.inflate(R.menu.setting_menu, menu);
super.onCreateOptionsMenu(menu, inflater);
mainMenu = menu;
}
//endregion
//---------------------------------------------------------------------------------------
//region Private
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);
}
}
}
/**
* View作成
* @return View
*/
private View initView() {
LayoutInflater inflater = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View view = inflater.inflate(R.layout.fragment_setting, null);
final Context context = view.getContext();
// Switchの設定
final Switch sw = (Switch)view.findViewById(R.id.statusSwitch);
onClickListener = new View.OnClickListener() {
@Override
public void onClick(final View v) {
// プログレスダイアログを表示
final ProgressDialog dialog = Utils.showProgressDialog(getActivity());
final SlackManager.FinishCallback<Boolean> finishCallback = new SlackManager.FinishCallback<Boolean>() {
@Override
public void onFinish(Boolean retry, Exception error) {
if (retry) {
// 再試行
onClickListener.onClick(v);
} else {
// 状態を更新
refreshStatus(view);
}
}
};
if (sw.isChecked()) {
// ネットワーク接続チェック
if (!Utils.onlineCheck(context)) {
// プログレスダイアログを閉じる
dialog.dismiss();
// エラー表示
Utils.showNetworkErrorDialog(context, finishCallback);
return;
}
// 接続
SlackManager.INSTANCE.connect(new SlackManager.FinishCallback<Void>() {
@Override
public void onFinish(Void aVoid, final Exception error) {
// プログレスダイアログを閉じる
dialog.dismiss();
// 状態を更新
refreshStatus(view);
if (error != null) {
if (error instanceof SlackManager.SlackAuthException) {
// エラー表示
Utils.showSlackAuthErrorDialog(context, getFragmentManager(), finishCallback);
} else if (error instanceof SlackManager.SlackConnectionException) {
// エラー表示
Utils.showSlackErrorDialog(context, finishCallback);
} else {
// エラー表示
Utils.showErrorDialog(context, finishCallback);
}
}
}
});
} else {
SlackManager.INSTANCE.disconnect(new SlackManager.FinishCallback<Void>() {
@Override
public void onFinish(Void aVoid, Exception error) {
// プログレスダイアログを閉じる
dialog.dismiss();
// 状態を更新
refreshStatus(view);
}
});
}
}
};
sw.setOnClickListener(onClickListener);
refreshStatus(view);
return view;
}
/**
* 画面の状態を更新する
*/
private void refreshStatus(View v) {
// TeamNameの設定
if (v != null) {
TextView teamText = (TextView) v.findViewById(R.id.teamText);
if (SlackManager.INSTANCE.isConnected()) {
String name = SlackManager.INSTANCE.getBotInfo().teamDomain;
teamText.setText(name + ".slack.com");
Utils.saveOnlineStatus(getActivity(), true);
} else {
teamText.setText("");
Utils.saveOnlineStatus(getActivity(), false);
}
// Switchの設定
Switch sw = (Switch) v.findViewById(R.id.statusSwitch);
sw.setChecked(SlackManager.INSTANCE.isConnected());
}
}
//endregion
//---------------------------------------------------------------------------------------
//region ShowMenuFragment
/**
* メニューを表示
*/
public void showMenu() {
mainMenu.performIdentifierAction(R.id.overflow_options, 0);
}
//endregion
//---------------------------------------------------------------------------------------
//region SlackEventListener
@Override
public void OnConnect() {
refreshStatus(getView());
}
@Override
public void OnConnectLost() {
}
@Override
public void OnReceiveSlackMessage(SlackManager.HistoryInfo info) {
}
}