Add LocationServicesHelper

Add LocationCallbacks
This commit is contained in:
Adeel 2019-08-26 06:58:34 +05:00
parent f0975b0d23
commit 62b7a99e18
3 changed files with 117 additions and 83 deletions

View File

@ -0,0 +1,5 @@
package org.kiwix.kiwixmobile.webserver;
public interface LocationCallbacks {
void onLocationSet();
}

View File

@ -0,0 +1,103 @@
package org.kiwix.kiwixmobile.webserver;
import android.app.Activity;
import android.content.Intent;
import android.content.IntentSender;
import android.util.Log;
import com.google.android.gms.common.api.ApiException;
import com.google.android.gms.common.api.ResolvableApiException;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationSettingsRequest;
import com.google.android.gms.location.LocationSettingsResponse;
import com.google.android.gms.location.LocationSettingsStates;
import com.google.android.gms.location.LocationSettingsStatusCodes;
import com.google.android.gms.tasks.Task;
public class LocationServicesHelper {
private Activity activity;
private LocationCallbacks locationCallbacks;
private static final String TAG = "LocationServicesHelper";
public static final int LOCATION_SETTINGS_PERMISSION_RESULT = 101;
public LocationServicesHelper(Activity activity) {
this.activity = activity;
locationCallbacks = (LocationCallbacks) activity;
}
private Task<LocationSettingsResponse> task;
public void setupLocationServices() {
LocationRequest locationRequest = new LocationRequest();
locationRequest.setInterval(10);
locationRequest.setSmallestDisplacement(10);
locationRequest.setFastestInterval(10);
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
LocationSettingsRequest.Builder builder = new
LocationSettingsRequest.Builder();
builder.addLocationRequest(locationRequest);
task = com.google.android.gms.location.LocationServices.getSettingsClient(activity)
.checkLocationSettings(builder.build());
locationSettingsResponseBuilder();
}
public void locationSettingsResponseBuilder() {
task.addOnCompleteListener(task -> {
try {
LocationSettingsResponse response = task.getResult(ApiException.class);
// All location settings are satisfied. The client can initialize location
// requests here.
locationCallbacks.onLocationSet();
//}
} catch (ApiException exception) {
switch (exception.getStatusCode()) {
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
// Location settings are not satisfied. But could be fixed by showing the
// user a dialog.
try {
// Cast to a resolvable exception.
ResolvableApiException resolvable = (ResolvableApiException) exception;
// Show the dialog by calling startResolutionForResult(),
// and check the result in onActivityResult().
resolvable.startResolutionForResult(
activity,
LOCATION_SETTINGS_PERMISSION_RESULT);
} catch (IntentSender.SendIntentException e) {
// Ignore the error.
} catch (ClassCastException e) {
// Ignore, should be an impossible error.
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
// Location settings are not satisfied. However, we have no way to fix the
// settings so we won't show the dialog.
break;
default:
break;
}
}
});
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
//Checking the result code for LocationSettings resolution
if (requestCode == LOCATION_SETTINGS_PERMISSION_RESULT) {
final LocationSettingsStates states = LocationSettingsStates.fromIntent(data);
switch (resultCode) {
case Activity.RESULT_OK:
// All required changes were successfully made
Log.v(TAG, states.isLocationPresent() + "");
locationCallbacks.onLocationSet();
break;
case Activity.RESULT_CANCELED:
// The user was asked to change settings, but chose not to
Log.v(TAG, "Canceled");
break;
default:
break;
}
}
}
}

View File

@ -1,12 +1,10 @@
package org.kiwix.kiwixmobile.webserver;
import android.Manifest;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentSender;
import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.net.ConnectivityManager;
@ -26,14 +24,7 @@ import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
import com.google.android.gms.common.api.ApiException;
import com.google.android.gms.common.api.ResolvableApiException;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.location.LocationSettingsRequest;
import com.google.android.gms.location.LocationSettingsResponse;
import com.google.android.gms.location.LocationSettingsStates;
import com.google.android.gms.location.LocationSettingsStatusCodes;
import com.google.android.gms.tasks.Task;
import io.reactivex.Flowable;
import io.reactivex.SingleObserver;
@ -66,7 +57,7 @@ import static org.kiwix.kiwixmobile.wifi_hotspot.HotspotService.ACTION_TURN_OFF_
import static org.kiwix.kiwixmobile.wifi_hotspot.HotspotService.ACTION_TURN_ON_AFTER_O;
public class ZimHostActivity extends BaseActivity implements
ZimHostCallbacks, ZimHostContract.View {
ZimHostCallbacks, ZimHostContract.View, LocationCallbacks {
@BindView(R.id.startServerButton)
Button startServerButton;
@ -94,6 +85,7 @@ public class ZimHostActivity extends BaseActivity implements
HotspotService hotspotService;
private String ip;
private ServiceConnection serviceConnection;
LocationServicesHelper locationServicesHelper;
ArrayList<String> selectedBooksPath = new ArrayList<>();
@Override
@ -153,6 +145,7 @@ public class ZimHostActivity extends BaseActivity implements
startHotspotHelper();
}
});
locationServicesHelper = new LocationServicesHelper(ZimHostActivity.this);
}
private void startHotspotHelper() {
@ -291,23 +284,7 @@ public class ZimHostActivity extends BaseActivity implements
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
//Checking the result code for LocationSettings resolution
if (requestCode == LOCATION_SETTINGS_PERMISSION_RESULT) {
final LocationSettingsStates states = LocationSettingsStates.fromIntent(data);
switch (resultCode) {
case Activity.RESULT_OK:
// All required changes were successfully made
Log.v(TAG, states.isLocationPresent() + "");
startService(createHotspotIntent(ACTION_TURN_ON_AFTER_O));
break;
case Activity.RESULT_CANCELED:
// The user was asked to change settings, but chose not to
Log.v(TAG, "Canceled");
break;
default:
break;
}
}
locationServicesHelper.onActivityResult(requestCode, resultCode, data);
}
@Override protected void onDestroy() {
@ -325,61 +302,6 @@ public class ZimHostActivity extends BaseActivity implements
toolbar.setNavigationOnClickListener(v -> onBackPressed());
}
private void setupLocationServices() {
LocationRequest locationRequest = new LocationRequest();
locationRequest.setInterval(10);
locationRequest.setSmallestDisplacement(10);
locationRequest.setFastestInterval(10);
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
LocationSettingsRequest.Builder builder = new
LocationSettingsRequest.Builder();
builder.addLocationRequest(locationRequest);
task = LocationServices.getSettingsClient(this).checkLocationSettings(builder.build());
locationSettingsResponseBuilder();
}
private void locationSettingsResponseBuilder() {
task.addOnCompleteListener(task -> {
try {
LocationSettingsResponse response = task.getResult(ApiException.class);
// All location settings are satisfied. The client can initialize location
// requests here.
startService(createHotspotIntent(ACTION_TURN_ON_AFTER_O));
//}
} catch (ApiException exception) {
switch (exception.getStatusCode()) {
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
// Location settings are not satisfied. But could be fixed by showing the
// user a dialog.
try {
// Cast to a resolvable exception.
ResolvableApiException resolvable = (ResolvableApiException) exception;
// Show the dialog by calling startResolutionForResult(),
// and check the result in onActivityResult().
resolvable.startResolutionForResult(
ZimHostActivity.this,
LOCATION_SETTINGS_PERMISSION_RESULT);
} catch (IntentSender.SendIntentException e) {
// Ignore the error.
} catch (ClassCastException e) {
// Ignore, should be an impossible error.
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
// Location settings are not satisfied. However, we have no way to fix the
// settings so we won't show the dialog.
break;
default:
break;
}
}
});
}
//Advice user to turn on hotspot manually for API<26
private void startHotspotManuallyDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this, dialogStyle());
@ -528,7 +450,7 @@ public class ZimHostActivity extends BaseActivity implements
startService(createHotspotIntent(ACTION_TURN_OFF_AFTER_O));
} else //If hotspot is not already enabled, then turn it on.
{
setupLocationServices();
locationServicesHelper.setupLocationServices();
}
}
@ -542,4 +464,8 @@ public class ZimHostActivity extends BaseActivity implements
@Override public void addBooks(@Nullable List<BooksOnDiskListItem> books) {
booksAdapter.setItems(books);
}
@Override public void onLocationSet() {
createHotspotIntent(ACTION_TURN_ON_AFTER_O);
}
}