diff --git a/app/src/main/java/com/example/cosmosclient/app/Cosmos.java b/app/src/main/java/com/example/cosmosclient/app/Cosmos.java index d050520..ab281c2 100644 --- a/app/src/main/java/com/example/cosmosclient/app/Cosmos.java +++ b/app/src/main/java/com/example/cosmosclient/app/Cosmos.java @@ -1,36 +1,123 @@ package com.example.cosmosclient.app; +import android.Manifest; +import android.app.Activity; import android.app.Application; import android.content.ComponentCallbacks; import android.content.res.Configuration; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.os.Build; +import android.os.Bundle; +import android.support.annotation.RequiresApi; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; import android.util.Log; import com.example.cosmosclient.entities.AreaInformation; import com.example.cosmosclient.entities.Group; +import com.example.cosmosclient.services.CosmosBackgroundService; +import com.example.cosmosclient.views.RequestPermissionsActivty; + import android.content.SharedPreferences; +import android.view.Gravity; +import android.widget.Toast; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; public class Cosmos extends Application { + private String TAG = Cosmos.class.getSimpleName(); private String token=null; private Group curGroup=null; private HashMap groups = new HashMap<>(); private String uId=null; private HashMap areaInfo = new HashMap<>(); private ArrayList areaInfoKey= new ArrayList<>(); - private String TAG = Cosmos.class.getSimpleName(); + private static final int REQUEST_MULTI_PERMISSIONS = 101; + ArrayList reqPermissions = new ArrayList<>(); public Cosmos() { super(); Log.d(TAG, " Constructor"); + + + registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { + @Override + public void onActivityCreated(Activity activity, Bundle bundle) { + Log.d(TAG, activity + "onActivityCreated"); + // 未許可あり + if (activity instanceof RequestPermissionsActivty && !reqPermissions.isEmpty()) { + Log.d(TAG, "isRequestPermission"); + ((RequestPermissionsActivty)activity).setOnRequestPermissionsResultCallback(new ActivityCompat.OnRequestPermissionsResultCallback() { + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + Log.d(TAG, "onRequestPermissionsResult"); + if (requestCode == REQUEST_MULTI_PERMISSIONS) { + if (grantResults.length > 0) { + for (int i = 0; i < permissions.length; i++) { + if (permissions[i].equals(Manifest.permission.ACCESS_FINE_LOCATION)) { // 位置情報 + if (grantResults[i] == PackageManager.PERMISSION_GRANTED) { + // 許可された + } else { + // それでも拒否された時の対応 + toastMake("位置情報の許可がないので計測できません"); + } + } else if (permissions[i].equals(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { // 外部ストレージ + if (grantResults[i] == PackageManager.PERMISSION_GRANTED) { + // 許可された + } else { + // それでも拒否された時の対応 + toastMake("外部書込の許可がないので書き込みできません"); + } + } + } + startBackgroundService(getApplicationContext()); + } + } + } + }); + ActivityCompat.requestPermissions(activity, (String[]) reqPermissions.toArray(new String[0]), REQUEST_MULTI_PERMISSIONS); + } + } + + @Override + public void onActivityStarted(Activity activity) { + } + + @Override + public void onActivityResumed(Activity activity) { + } + + @Override + public void onActivityPaused(Activity activity) { + } + + @Override + public void onActivityStopped(Activity activity) { + } + + @Override + public void onActivitySaveInstanceState(Activity activity, Bundle bundle) { + } + + @Override + public void onActivityDestroyed(Activity activity) { + } + + }); } @Override public void onCreate() { - Log.d(TAG, " onCreate"); + Log.d(TAG, "onCreate"); super.onCreate(); + // Android 6, API 23以上でペーミッションの確認 + if (Build.VERSION.SDK_INT >= 23) { + checkMultiPermissions(getApplicationContext()); + } } @Override @@ -162,4 +249,39 @@ return areaInfoKey; } + // 位置情報許可の確認、外部ストレージのPermissionにも対応できるようにしておく + private void checkMultiPermissions(Context context){ + int permissionLocation = ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION); // 位置情報の Permission + int permissionExtStorage = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE); // 外部ストレージ書き込みの Permission + // 位置情報の Permission が許可されているか確認 + if (permissionLocation == PackageManager.PERMISSION_GRANTED) { + // 許可済 + startBackgroundService(context); + } else{ + // 未許可 + reqPermissions.add(Manifest.permission.ACCESS_FINE_LOCATION); + } + } + + //BackgroundServiceをスタートさせる + public void startBackgroundService(final Context context) { + final Thread thread = new Thread() { + @RequiresApi(api = Build.VERSION_CODES.O) + public void run() { + // サービスの起動 + Intent intentservice = new Intent(context, CosmosBackgroundService.class); + context.startForegroundService(intentservice); + } + }; + thread.start(); + } + + // トーストの生成 + private void toastMake(String message){ + Toast toast = Toast.makeText(this, message, Toast.LENGTH_LONG); + // 位置調整 + toast.setGravity(Gravity.CENTER, 0, 200); + toast.show(); + } + } diff --git a/app/src/main/java/com/example/cosmosclient/services/CosmosBackgroundService.java b/app/src/main/java/com/example/cosmosclient/services/CosmosBackgroundService.java index 004a50a..b5939ef 100644 --- a/app/src/main/java/com/example/cosmosclient/services/CosmosBackgroundService.java +++ b/app/src/main/java/com/example/cosmosclient/services/CosmosBackgroundService.java @@ -57,7 +57,7 @@ private LocationManager locationManager; private static final int MinTime = 1000;/*最小時間間隔*/ private static final float MinDistance = 1;/*最小距離間隔*/ - private boolean isServiceRunning = false; //サービスが起動しているかを確認 + private static boolean isServiceRunning = false; //サービスが起動しているかを確認 private String TAG = CosmosBackgroundService.class.getSimpleName(); private List notifications =null; private CosmosLocation LOC = new CosmosLocation(); diff --git a/app/src/main/java/com/example/cosmosclient/services/CosmosBootReceiver.java b/app/src/main/java/com/example/cosmosclient/services/CosmosBootReceiver.java index 20ae4d2..f6dd452 100644 --- a/app/src/main/java/com/example/cosmosclient/services/CosmosBootReceiver.java +++ b/app/src/main/java/com/example/cosmosclient/services/CosmosBootReceiver.java @@ -1,55 +1,15 @@ package com.example.cosmosclient.services; -import android.Manifest; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; -import android.content.pm.PackageManager; -import android.os.Build; -import android.support.annotation.RequiresApi; -import android.support.v4.content.ContextCompat; import android.util.Log; public class CosmosBootReceiver extends BroadcastReceiver { - private static final int REQUEST_MULTI_PERMISSIONS = 101; private String TAG = CosmosBootReceiver.class.getSimpleName(); @Override public void onReceive(Context context, Intent intent) { Log.d(TAG, "onReceive"); - // Android 6, API 23以上でペーミッションの確認 - if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction()) && Build.VERSION.SDK_INT >= 23) { - checkMultiPermissions(context); - } else{ - // サービスの起動 - startService(context); - } - } - - // 位置情報許可の確認、外部ストレージのPermissionにも対応できるようにしておく - private void checkMultiPermissions(Context context){ - // 位置情報の Permission - int permissionLocation = ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION); - - // 位置情報の Permission が許可されているか確認 - if (permissionLocation == PackageManager.PERMISSION_GRANTED) { - // 許可済 - startService(context); - } else{ - // 未許可 - } - } - - //serviceをスタートさせる - private void startService(final Context context) { - final Thread thread = new Thread() { - @RequiresApi(api = Build.VERSION_CODES.O) - public void run() { - // サービスの起動 - Intent intentservice = new Intent(context, CosmosBackgroundService.class); - context.startForegroundService(intentservice); - } - }; - thread.start(); } } diff --git a/app/src/main/java/com/example/cosmosclient/views/RequestPermissionsActivty.java b/app/src/main/java/com/example/cosmosclient/views/RequestPermissionsActivty.java new file mode 100644 index 0000000..794e5ec --- /dev/null +++ b/app/src/main/java/com/example/cosmosclient/views/RequestPermissionsActivty.java @@ -0,0 +1,21 @@ +package com.example.cosmosclient.views; + +import android.support.annotation.NonNull; +import android.support.v4.app.ActivityCompat; +import android.support.v7.app.AppCompatActivity; + +import com.example.cosmosclient.app.Cosmos; + +public class RequestPermissionsActivty extends AppCompatActivity { + private ActivityCompat.OnRequestPermissionsResultCallback listener = null; + + public void setOnRequestPermissionsResultCallback(ActivityCompat.OnRequestPermissionsResultCallback listener) { + this.listener = listener; + } + + // 結果の受け取り + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + listener.onRequestPermissionsResult(requestCode, permissions, grantResults); + } +} diff --git a/app/src/main/java/com/example/cosmosclient/views/SigninActivity.java b/app/src/main/java/com/example/cosmosclient/views/SigninActivity.java index 9b75c51..115ff08 100644 --- a/app/src/main/java/com/example/cosmosclient/views/SigninActivity.java +++ b/app/src/main/java/com/example/cosmosclient/views/SigninActivity.java @@ -1,20 +1,10 @@ package com.example.cosmosclient.views; -import android.content.Context; -import android.Manifest; import android.content.Intent; -import android.content.pm.PackageManager; -import android.os.Build; import android.os.Handler; -import android.support.annotation.NonNull; -import android.support.annotation.RequiresApi; -import android.support.v4.app.ActivityCompat; -import android.support.v4.content.ContextCompat; -import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; -import android.view.Gravity; import android.view.View; import android.widget.Button; import android.widget.EditText; @@ -24,9 +14,6 @@ import com.example.cosmosclient.app.Cosmos; import com.example.cosmosclient.entities.SigninResponse; import com.example.cosmosclient.resources.UsersRest; -import com.example.cosmosclient.services.CosmosBackgroundService; - -import java.util.ArrayList; import retrofit2.Call; import retrofit2.Callback; @@ -34,28 +21,15 @@ import retrofit2.Retrofit; import retrofit2.converter.jackson.JacksonConverterFactory; -public class SigninActivity extends AppCompatActivity { +public class SigninActivity extends RequestPermissionsActivty { private boolean uIdEnable; private boolean pwEnable; private Button SigninButton; - private Intent intentservice; - private static final int REQUEST_MULTI_PERMISSIONS = 101; - - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_signin); - Context context = getApplicationContext(); - - // Android 6, API 23以上でパーミッシンの確認 - if(Build.VERSION.SDK_INT >= 23){ - checkMultiPermissions(); - } - else{ - startService(); - } //各種IDを取得 SigninButton = findViewById(R.id.SigninButton); @@ -90,7 +64,6 @@ UserIdText.addTextChangedListener(new SigninActivity.GenericTextWatcher(UserIdText)); PasswordText.addTextChangedListener(new SigninActivity.GenericTextWatcher(PasswordText)); - //retrofitの処理 final Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://nitta-lab-www.is.konan-u.ac.jp/cosmos/rest/") @@ -221,95 +194,4 @@ } } } - // 結果の受け取り - @Override - public void onRequestPermissionsResult(int requestCode, - @NonNull String[] permissions, @NonNull int[] grantResults) { - - if (requestCode == REQUEST_MULTI_PERMISSIONS) { - if (grantResults.length > 0) { - for (int i = 0; i < permissions.length; i++) { - // 位置情報 - if (permissions[i]. - equals(Manifest.permission.ACCESS_FINE_LOCATION)) { - if (grantResults[i] == PackageManager.PERMISSION_GRANTED) { - // 許可された - - } else { - // それでも拒否された時の対応 - toastMake("位置情報の許可がないので計測できません"); - } - } - // 外部ストレージ - else if (permissions[i]. - equals(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { - if (grantResults[i] == PackageManager.PERMISSION_GRANTED) { - // 許可された - } else { - // それでも拒否された時の対応 - toastMake("外部書込の許可がないので書き込みできません"); - } - } - } - - startService(); - - } - } - else{ - // - } - } - // 位置情報許可の確認、外部ストレージのPermissionにも対応できるようにしておく - private void checkMultiPermissions(){ - // 位置情報の Permission - int permissionLocation = ContextCompat.checkSelfPermission(this, - Manifest.permission.ACCESS_FINE_LOCATION); - // 外部ストレージ書き込みの Permission - int permissionExtStorage = ContextCompat.checkSelfPermission(this, - Manifest.permission.WRITE_EXTERNAL_STORAGE); - - ArrayList reqPermissions = new ArrayList<>(); - - // 位置情報の Permission が許可されているか確認 - if (permissionLocation == PackageManager.PERMISSION_GRANTED) { - // 許可済 - } - else{ - // 未許可 - reqPermissions.add(Manifest.permission.ACCESS_FINE_LOCATION); - } - - - // 未許可 - if (!reqPermissions.isEmpty()) { - ActivityCompat.requestPermissions(this, - (String[]) reqPermissions.toArray(new String[0]), - REQUEST_MULTI_PERMISSIONS); - // 未許可あり - } - else{ - // 許可済 - startService(); - } - } - //serviceをスタートさせる - private void startService() { - Thread thread = new Thread() { - @RequiresApi(api = Build.VERSION_CODES.O) - public void run() { - intentservice = new Intent(SigninActivity.this, CosmosBackgroundService.class); - startForegroundService(intentservice); - - } - }; - thread.start(); - } - // トーストの生成 - private void toastMake(String message){ - Toast toast = Toast.makeText(this, message, Toast.LENGTH_LONG); - // 位置調整 - toast.setGravity(Gravity.CENTER, 0, 200); - toast.show(); - } }