import
android.os.Bundle;
import
android.os.Handler;
import
android.os.Message;
import
android.os.SystemClock;
import
android.text.Editable;
import
android.text.TextWatcher;
import
android.util.Log;
import
android.view.View;
import
android.view.inputmethod.InputMethodManager;
import
android.widget.Button;
import
android.widget.EditText;
import
android.widget.Toast;
import
androidx.appcompat.app.AppCompatActivity;
public
class
Fragment_timer
extends
AppCompatActivity {
Button button_start, button_reset, button_end;
EditText time_min, time_sec;
InputMethodManager imm;
Handler handler =
new
Handler(){
public
void
handleMessage(Message message) {
String time = getTimeOut();
if
(time.equals(
"00:00"
)){
reset();
}
else
{
handler.sendEmptyMessage(
0
);
}
}
};
final
static
int
INIT =
0
;
final
static
int
RUN =
1
;
final
static
int
PAUSE =
2
;
int
cur_status = INIT;
long
baseTime;
long
pauseTime;
long
setTime;
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.fragment_timer);
imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
time_min = findViewById(R.id.time_min);
time_min.addTextChangedListener(
new
TextWatcher() {
@Override
public
void
beforeTextChanged(CharSequence s,
int
start,
int
count,
int
after) {
}
@Override
public
void
onTextChanged(CharSequence s,
int
start,
int
before,
int
count) {
if
(time_min.hasFocus() && getEditTime() !=
0
){
setTime();
Log.d(
"ProgressTest"
,
"setTime = "
+ setTime);
}
}
@Override
public
void
afterTextChanged(Editable s) {
}
});
time_sec = findViewById(R.id.time_sec);
time_sec.addTextChangedListener(
new
TextWatcher() {
@Override
public
void
beforeTextChanged(CharSequence s,
int
start,
int
count,
int
after) {
}
@Override
public
void
onTextChanged(CharSequence s,
int
start,
int
before,
int
count) {
if
(time_sec.hasFocus() && getEditTime() !=
0
){
setTime();
Log.d(
"ProgressTest"
,
"setTime = "
+ setTime);
}
}
@Override
public
void
afterTextChanged(Editable s) {
}
});
button_start.findViewById(R.id.button_start);
button_reset.findViewById(R.id.button_reset);
button_start.setOnClickListener(
new
View.OnClickListener() {
@Override
public
void
onClick(View v) {
if
(getEditTime() !=
0
){
hideKeyboard();
start(cur_status);
}
else
{
Toast.makeText(Fragment_timer.
this
,
"시간을 입력하시오. 25분 추천."
, Toast.LENGTH_SHORT).show();
time_min.requestFocus();
}
}
});
button_reset.setOnClickListener(
new
View.OnClickListener() {
@Override
public
void
onClick(View v) {
reset();
}
});
}
public
void
reset(){
handler.removeCallbacksAndMessages(
null
);
cur_status = INIT;
setTime =
0
;
time_min.setText(
"00"
);
time_min.setEnabled(
true
);
time_sec.setText(
"00"
);
time_sec.setEnabled(
true
);
button_start.setText(
"시작"
);
button_reset.setEnabled(
false
);
}
public
void
hideKeyboard(){
imm.hideSoftInputFromWindow(time_min.getWindowToken(),
0
);
imm.hideSoftInputFromWindow(time_sec.getWindowToken(),
0
);
}
public
long
getEditTime(){
long
min = Long.parseLong(time_min.getText().toString())*
60
*
1000
;
long
sec = Long.parseLong(time_sec.getText().toString())*
1000
;
return
min+sec;
}
public
void
start(
int
status){
switch
(status) {
case
INIT:
baseTime = SystemClock.elapsedRealtime();
button_start.setText(
"멈춤"
);
button_reset.setEnabled(
false
);
time_min.setEnabled(
false
);
time_sec.setEnabled(
false
);
handler.sendEmptyMessage(
0
);
cur_status = RUN;
break
;
case
RUN:
handler.removeMessages(
0
);
pauseTime = SystemClock.elapsedRealtime();
button_start.setText(
"재시작"
);
button_reset.setEnabled(
true
);
cur_status = PAUSE;
break
;
case
PAUSE:
long
now = SystemClock.elapsedRealtime();
baseTime += (now-pauseTime);
button_start.setText(
"멈춤"
);
button_reset.setEnabled(
false
);
handler.sendEmptyMessage(
0
);
cur_status = RUN;
break
;
}
}
public
String getTimeOut(){
long
now = SystemClock.elapsedRealtime();
long
outTime = baseTime-now+setTime;
long
sec = outTime/
1000
%
60
;
long
min = outTime/
1000
/
60
;
if
(outTime%
1000
/
10
!=
0
&& sec <
60
) {
sec +=
1
;
if
(sec ==
60
) {
sec =
0
;
min +=
1
;
}
}
String easy_outTime = String.format(
"%02d:02d"
,min,sec);
String[] times = easy_outTime.split(
":"
);
time_min.setText(times[
0
]);
time_sec.setText(times[
1
]);
return
easy_outTime;
}
public
void
setTime() {
setTime = Long.parseLong(time_min.getText().toString()) *
1000
*
60
+ Long.parseLong(time_sec.getText().toString()) *
1000
;
}
}