package com.example.cosmosclient.services;
import android.Manifest;
import android.app.IntentService;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.support.annotation.RequiresApi;
import android.support.v4.app.ActivityCompat;
import android.util.Log;
import android.widget.Toast;
import com.example.cosmosclient.R;
import com.example.cosmosclient.app.Cosmos;
import com.example.cosmosclient.entities.AreaInformation;
import com.example.cosmosclient.entities.Feature;
import com.example.cosmosclient.entities.SignupResponse;
import com.example.cosmosclient.resources.LocationRest;
import com.example.cosmosclient.views.GroupListActivity;
import com.example.cosmosclient.views.SignupActivity;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.jackson.JacksonConverterFactory;
public class CosomosBackgroundService extends IntentService implements LocationListener {
private Context context;
private LocationManager locationManager;
private Location LOC;
private static final int MinTime = 1000;/*最小時間間隔*/
private static final float MinDistance = 1;/*最小距離間隔*/
public CosomosBackgroundService() {
super("CosomosBackgroundService");
}
@Override
public void onCreate() {
super.onCreate();
// Log.d("debug", "onCreate");
context = getApplicationContext();
// LocationManager インスタンス生成
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
}
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// Log.d("debug", "onStartCommand");
int requestCode = 0;
String channelId = "default";
String title = context.getString(R.string.app_name);
PendingIntent pendingIntent =
PendingIntent.getActivity(context, requestCode,
intent, PendingIntent.FLAG_UPDATE_CURRENT);
// ForegroundにするためNotificationが必要、Contextを設定
NotificationManager notificationManager =
(NotificationManager) context.
getSystemService(Context.NOTIFICATION_SERVICE);
// Notification Channel 設定
NotificationChannel channel = new NotificationChannel(
channelId, title, NotificationManager.IMPORTANCE_DEFAULT);
channel.setDescription("Silent Notification");
// 通知音を消さないと毎回通知音が出てしまう
// この辺りの設定はcleanにしてから変更
channel.setSound(null, null);
// 通知ランプを消す
channel.enableLights(false);
channel.setLightColor(Color.BLUE);
// 通知バイブレーション無し
channel.enableVibration(false);
if (notificationManager != null) {
notificationManager.createNotificationChannel(channel);
Notification notification = new Notification.Builder(context, channelId)
.setContentTitle(title)
// 本来なら衛星のアイコンですがandroid標準アイコンを設定
.setSmallIcon(android.R.drawable.btn_star)
.setContentText("GPS")
.setAutoCancel(true)
.setContentIntent(pendingIntent)
.setWhen(System.currentTimeMillis())
.build();
// startForeground
startForeground(1, notification);
}
startGPS();
return START_NOT_STICKY;
}
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
protected void onHandleIntent(Intent intent) {
// Log.d("debug", "onHandleIntent");
}
protected void startGPS() {
// Log.d("debug", "startGPS");
final boolean gpsEnabled
= locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
if (!gpsEnabled) {
// GPSを設定するように促す
enableLocationSettings();
}
if (locationManager != null) {
try {
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) !=
PackageManager.PERMISSION_GRANTED) {
return;
}
// Log.d("debug", "requestLocationUpdates:");
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
MinTime, MinDistance, this);
} catch (Exception e) {
// Log.d("debug", "Exception:");
e.printStackTrace();
}
} else {
}
}
@Override
public void onDestroy() {
// Log.d("debug", "onDestroy");
super.onDestroy();
}
@Override
public void onLocationChanged(Location location) {
// Log.d("debug", "onLocationChanged");
Log.d("debug", "lat:" + location.getLatitude());
Log.d("debug", "lon:" + location.getLongitude());
LOC.setLatitude(location.getLatitude());
LOC.setLongitude(location.getLongitude());
if(LOC.hashCode() == 0){
//retrofitの処理
final Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://nitta-lab-www.is.konan-u.ac.jp/cosmos/rest/")
.addConverterFactory(JacksonConverterFactory.create())
.build();
//interfaceから実装を取得
final LocationRest LocationService = retrofit.create(LocationRest.class);
//API呼び出しのための値入力
Call<AreaInformation> call = LocationService.LocationService(LOC.getLatitude(),LOC.getLongitude());
//サーバからデータ受け取り
call.enqueue(new Callback<AreaInformation>() {
//成功時
@Override
public void onResponse(Call<AreaInformation> call, Response<AreaInformation> response) {
if (response.isSuccessful()) {
AreaInformation result = response.body();
//app/Cosmosに情報保存
Cosmos app = (Cosmos) getApplication();
} else {
//onFailureでキャッチできないエラー用
}
}
//失敗時
@Override
public void onFailure(Call<AreaInformation> call, Throwable t) {
t.printStackTrace();
}
});
}
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
private void enableLocationSettings() {
Intent settingsIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(settingsIntent);
}
}