mirror of
https://github.com/kiwix/kiwix-android.git
synced 2025-08-03 18:56:44 -04:00
Merge pull request #1506 from kiwix/iadeelzafar/manual-hotspot
Iadeelzafar/manual hotspot
This commit is contained in:
commit
f9e722f72f
@ -12,9 +12,6 @@
|
||||
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
|
||||
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
||||
|
||||
<!-- Devices with version >= Oreo need location permission to start/stop the hotspot -->
|
||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
||||
|
||||
<!-- Device with versions >= Pie need this permission -->
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||
|
||||
|
@ -1,10 +1,8 @@
|
||||
package org.kiwix.kiwixmobile.di.modules
|
||||
|
||||
import android.app.Application
|
||||
import android.app.NotificationManager
|
||||
import android.app.Service
|
||||
import android.content.Context
|
||||
import android.net.wifi.WifiManager
|
||||
import dagger.Module
|
||||
import dagger.Provides
|
||||
import org.kiwix.kiwixlib.JNIKiwixLibrary
|
||||
@ -12,9 +10,9 @@ import org.kiwix.kiwixlib.JNIKiwixServer
|
||||
import org.kiwix.kiwixmobile.di.ServiceScope
|
||||
import org.kiwix.kiwixmobile.webserver.WebServerHelper
|
||||
import org.kiwix.kiwixmobile.wifi_hotspot.HotspotNotificationManager
|
||||
import org.kiwix.kiwixmobile.wifi_hotspot.HotspotStateListener
|
||||
import org.kiwix.kiwixmobile.wifi_hotspot.HotspotStateReceiver
|
||||
import org.kiwix.kiwixmobile.wifi_hotspot.HotspotStateReceiver.Callback
|
||||
import org.kiwix.kiwixmobile.wifi_hotspot.IpAddressCallbacks
|
||||
import org.kiwix.kiwixmobile.wifi_hotspot.WifiHotspotManager
|
||||
|
||||
@Module
|
||||
class ServiceModule {
|
||||
@ -27,19 +25,6 @@ class ServiceModule {
|
||||
ipAddressCallbacks: IpAddressCallbacks
|
||||
): WebServerHelper = WebServerHelper(jniKiwixLibrary, kiwixServer, ipAddressCallbacks)
|
||||
|
||||
@Provides
|
||||
@ServiceScope
|
||||
fun providesWifiHotspotManager(
|
||||
wifiManager: WifiManager,
|
||||
hotspotStateListener: HotspotStateListener
|
||||
): WifiHotspotManager =
|
||||
WifiHotspotManager(wifiManager, hotspotStateListener)
|
||||
|
||||
@Provides
|
||||
@ServiceScope
|
||||
fun providesHotspotStateListener(service: Service): HotspotStateListener =
|
||||
service as HotspotStateListener
|
||||
|
||||
@Provides
|
||||
@ServiceScope
|
||||
fun providesIpAddressCallbacks(service: Service): IpAddressCallbacks =
|
||||
@ -54,11 +39,6 @@ class ServiceModule {
|
||||
fun providesJNIKiwixServer(jniKiwixLibrary: JNIKiwixLibrary): JNIKiwixServer =
|
||||
JNIKiwixServer(jniKiwixLibrary)
|
||||
|
||||
@Provides
|
||||
@ServiceScope
|
||||
fun providesWifiManager(context: Application): WifiManager =
|
||||
context.getSystemService(Context.WIFI_SERVICE) as WifiManager
|
||||
|
||||
@Provides
|
||||
@ServiceScope
|
||||
fun providesHotspotNotificationManager(
|
||||
@ -66,4 +46,16 @@ class ServiceModule {
|
||||
context: Context
|
||||
): HotspotNotificationManager =
|
||||
HotspotNotificationManager(notificationManager, context)
|
||||
|
||||
@Provides
|
||||
@ServiceScope
|
||||
fun providesHotspotStateReceiver(
|
||||
callback: Callback
|
||||
): HotspotStateReceiver = HotspotStateReceiver(callback)
|
||||
|
||||
@Provides
|
||||
@ServiceScope
|
||||
fun providesHotspotStateReceiverCallback(
|
||||
service: Service
|
||||
): HotspotStateReceiver.Callback = service as Callback
|
||||
}
|
||||
|
@ -1,5 +0,0 @@
|
||||
package org.kiwix.kiwixmobile.webserver;
|
||||
|
||||
public interface LocationCallbacks {
|
||||
void onLocationSet();
|
||||
}
|
@ -1,107 +0,0 @@
|
||||
package org.kiwix.kiwixmobile.webserver;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentSender;
|
||||
import android.util.Log;
|
||||
import androidx.annotation.NonNull;
|
||||
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;
|
||||
import javax.inject.Inject;
|
||||
|
||||
public class LocationServicesHelper {
|
||||
private static final String TAG = "LocationServicesHelper";
|
||||
private final LocationCallbacks locationCallbacks;
|
||||
private final Activity activity;
|
||||
private static final int LOCATION_SETTINGS_PERMISSION_RESULT = 101;
|
||||
|
||||
@Inject
|
||||
public LocationServicesHelper(@NonNull Activity activity,
|
||||
@NonNull LocationCallbacks locationCallbacks) {
|
||||
this.activity = activity;
|
||||
this.locationCallbacks = locationCallbacks;
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
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.
|
||||
|
||||
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, @NonNull 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,14 +1,10 @@
|
||||
package org.kiwix.kiwixmobile.webserver;
|
||||
|
||||
import android.Manifest;
|
||||
import android.app.ProgressDialog;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.ServiceConnection;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.net.wifi.WifiConfiguration;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.IBinder;
|
||||
import android.util.Log;
|
||||
@ -18,8 +14,6 @@ import android.widget.Toast;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.core.app.ActivityCompat;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import butterknife.BindView;
|
||||
import java.io.File;
|
||||
@ -40,13 +34,11 @@ import org.kiwix.kiwixmobile.zim_manager.fileselect_view.adapter.BooksOnDiskAdap
|
||||
import org.kiwix.kiwixmobile.zim_manager.fileselect_view.adapter.BooksOnDiskListItem;
|
||||
|
||||
import static org.kiwix.kiwixmobile.wifi_hotspot.HotspotService.ACTION_CHECK_IP_ADDRESS;
|
||||
import static org.kiwix.kiwixmobile.wifi_hotspot.HotspotService.ACTION_LOCATION_ACCESS_GRANTED;
|
||||
import static org.kiwix.kiwixmobile.wifi_hotspot.HotspotService.ACTION_START_SERVER;
|
||||
import static org.kiwix.kiwixmobile.wifi_hotspot.HotspotService.ACTION_STOP_SERVER;
|
||||
import static org.kiwix.kiwixmobile.wifi_hotspot.HotspotService.ACTION_TOGGLE_HOTSPOT;
|
||||
|
||||
public class ZimHostActivity extends BaseActivity implements
|
||||
ZimHostCallbacks, ZimHostContract.View, LocationCallbacks {
|
||||
ZimHostCallbacks, ZimHostContract.View {
|
||||
|
||||
@BindView(R.id.startServerButton)
|
||||
Button startServerButton;
|
||||
@ -61,11 +53,7 @@ public class ZimHostActivity extends BaseActivity implements
|
||||
@Inject
|
||||
AlertDialogShower alertDialogShower;
|
||||
|
||||
@Inject
|
||||
LocationServicesHelper locationServicesHelper;
|
||||
|
||||
private static final String TAG = "ZimHostActivity";
|
||||
private static final int MY_PERMISSIONS_ACCESS_FINE_LOCATION = 102;
|
||||
private static final String IP_STATE_KEY = "ip_state_key";
|
||||
public static final String SELECTED_ZIM_PATHS_KEY = "selected_zim_paths";
|
||||
|
||||
@ -133,15 +121,11 @@ public class ZimHostActivity extends BaseActivity implements
|
||||
}
|
||||
|
||||
private void startHotspotHelper() {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
toggleHotspot();
|
||||
} else {
|
||||
if (ServerUtils.isServerStarted) {
|
||||
startService(createHotspotIntent(ACTION_STOP_SERVER));
|
||||
} else {
|
||||
startHotspotManuallyDialog();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private ArrayList<String> getSelectedBooksPath() {
|
||||
@ -190,21 +174,6 @@ public class ZimHostActivity extends BaseActivity implements
|
||||
}
|
||||
}
|
||||
|
||||
private void toggleHotspot() {
|
||||
//Check if location permissions are granted
|
||||
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
|
||||
== PackageManager.PERMISSION_GRANTED) {
|
||||
//Toggle hotspot if location permissions are granted
|
||||
startService(createHotspotIntent(
|
||||
ACTION_TOGGLE_HOTSPOT));
|
||||
} else {
|
||||
//Ask location permission if not granted
|
||||
ActivityCompat.requestPermissions(this,
|
||||
new String[] { Manifest.permission.ACCESS_FINE_LOCATION },
|
||||
MY_PERMISSIONS_ACCESS_FINE_LOCATION);
|
||||
}
|
||||
}
|
||||
|
||||
@Override protected void onResume() {
|
||||
super.onResume();
|
||||
presenter.loadBooks();
|
||||
@ -233,23 +202,6 @@ public class ZimHostActivity extends BaseActivity implements
|
||||
booksAdapter.notifyDataSetChanged();
|
||||
}
|
||||
|
||||
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
|
||||
@NonNull int[] grantResults) {
|
||||
if (requestCode == MY_PERMISSIONS_ACCESS_FINE_LOCATION) {
|
||||
if (grantResults.length > 0
|
||||
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
toggleHotspot();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
|
||||
locationServicesHelper.onActivityResult(requestCode, resultCode, (data));
|
||||
}
|
||||
|
||||
@Override protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
presenter.detachView();
|
||||
@ -302,18 +254,6 @@ public class ZimHostActivity extends BaseActivity implements
|
||||
Toast.makeText(this, R.string.server_failed_toast_message, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
|
||||
@Override public void onHotspotTurnedOn(@NonNull WifiConfiguration wifiConfiguration) {
|
||||
alertDialogShower.show(new KiwixDialog.ShowHotspotDetails(wifiConfiguration),
|
||||
(Function0<Unit>) () -> {
|
||||
progressDialog =
|
||||
ProgressDialog.show(this,
|
||||
getString(R.string.progress_dialog_starting_server), "",
|
||||
true);
|
||||
startService(createHotspotIntent(ACTION_CHECK_IP_ADDRESS));
|
||||
return Unit.INSTANCE;
|
||||
});
|
||||
}
|
||||
|
||||
private void launchTetheringSettingsScreen() {
|
||||
final Intent intent = new Intent(Intent.ACTION_MAIN, null);
|
||||
intent.addCategory(Intent.CATEGORY_LAUNCHER);
|
||||
@ -324,19 +264,6 @@ public class ZimHostActivity extends BaseActivity implements
|
||||
startActivity(intent);
|
||||
}
|
||||
|
||||
@Override public void onHotspotFailedToStart() {
|
||||
//Show a dialog to turn off default hotspot
|
||||
alertDialogShower.show(KiwixDialog.TurnOffHotspotManually.INSTANCE,
|
||||
(Function0<Unit>) () -> {
|
||||
launchTetheringSettingsScreen();
|
||||
return Unit.INSTANCE;
|
||||
});
|
||||
}
|
||||
|
||||
@Override public void requestLocationAccess() {
|
||||
locationServicesHelper.setupLocationServices();
|
||||
}
|
||||
|
||||
@Override protected void onSaveInstanceState(@Nullable Bundle outState) {
|
||||
super.onSaveInstanceState(outState);
|
||||
if (ServerUtils.isServerStarted) {
|
||||
@ -348,10 +275,6 @@ public class ZimHostActivity extends BaseActivity implements
|
||||
booksAdapter.setItems(books);
|
||||
}
|
||||
|
||||
@Override public void onLocationSet() {
|
||||
startService(createHotspotIntent(ACTION_LOCATION_ACCESS_GRANTED));
|
||||
}
|
||||
|
||||
@Override public void onIpAddressValid() {
|
||||
progressDialog.dismiss();
|
||||
startService(createHotspotIntent(ACTION_START_SERVER).putStringArrayListExtra(
|
||||
|
@ -11,12 +11,6 @@ public interface ZimHostCallbacks {
|
||||
|
||||
void onServerFailedToStart();
|
||||
|
||||
void onHotspotTurnedOn(@NonNull WifiConfiguration wifiConfiguration);
|
||||
|
||||
void onHotspotFailedToStart();
|
||||
|
||||
void requestLocationAccess();
|
||||
|
||||
void onIpAddressValid();
|
||||
|
||||
void onIpAddressInvalid();
|
||||
|
@ -18,16 +18,5 @@ public class ZimHostModule {
|
||||
@Provides Activity providesActivity(ZimHostActivity zimHostActivity) {
|
||||
return zimHostActivity;
|
||||
}
|
||||
|
||||
@ActivityScope
|
||||
@Provides LocationServicesHelper providesLocationServicesHelper(ZimHostActivity activity,
|
||||
LocationCallbacks locationCallbacks) {
|
||||
return new LocationServicesHelper(activity, locationCallbacks);
|
||||
}
|
||||
|
||||
@ActivityScope
|
||||
@Provides LocationCallbacks providesLocationCallbacks(ZimHostActivity activity) {
|
||||
return activity;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2,9 +2,7 @@ package org.kiwix.kiwixmobile.wifi_hotspot;
|
||||
|
||||
import android.app.Service;
|
||||
import android.content.Intent;
|
||||
import android.net.wifi.WifiConfiguration;
|
||||
import android.os.Binder;
|
||||
import android.os.Build;
|
||||
import android.os.IBinder;
|
||||
import android.widget.Toast;
|
||||
import androidx.annotation.NonNull;
|
||||
@ -12,6 +10,7 @@ import androidx.annotation.Nullable;
|
||||
import javax.inject.Inject;
|
||||
import org.kiwix.kiwixmobile.KiwixApplication;
|
||||
import org.kiwix.kiwixmobile.R;
|
||||
import org.kiwix.kiwixmobile.extensions.ContextExtensionsKt;
|
||||
import org.kiwix.kiwixmobile.utils.ServerUtils;
|
||||
import org.kiwix.kiwixmobile.webserver.WebServerHelper;
|
||||
import org.kiwix.kiwixmobile.webserver.ZimHostCallbacks;
|
||||
@ -24,10 +23,9 @@ import static org.kiwix.kiwixmobile.wifi_hotspot.HotspotNotificationManager.HOTS
|
||||
* Created by Adeel Zafar on 07/01/2019.
|
||||
*/
|
||||
|
||||
public class HotspotService extends Service implements HotspotStateListener, IpAddressCallbacks {
|
||||
public class HotspotService extends Service
|
||||
implements IpAddressCallbacks, HotspotStateReceiver.Callback {
|
||||
|
||||
public static final String ACTION_TOGGLE_HOTSPOT = "toggle_hotspot";
|
||||
public static final String ACTION_LOCATION_ACCESS_GRANTED = "location_access_granted";
|
||||
public static final String ACTION_START_SERVER = "start_server";
|
||||
public static final String ACTION_STOP_SERVER = "stop_server";
|
||||
public static final String ACTION_CHECK_IP_ADDRESS = "check_ip_address";
|
||||
@ -38,9 +36,9 @@ public class HotspotService extends Service implements HotspotStateListener, IpA
|
||||
@Inject
|
||||
WebServerHelper webServerHelper;
|
||||
@Inject
|
||||
WifiHotspotManager hotspotManager;
|
||||
@Inject
|
||||
HotspotNotificationManager hotspotNotificationManager;
|
||||
@Inject
|
||||
HotspotStateReceiver hotspotStateReceiver;
|
||||
|
||||
@Override public void onCreate() {
|
||||
KiwixApplication.getApplicationComponent()
|
||||
@ -49,49 +47,26 @@ public class HotspotService extends Service implements HotspotStateListener, IpA
|
||||
.build()
|
||||
.inject(this);
|
||||
super.onCreate();
|
||||
ContextExtensionsKt.registerReceiver(this, hotspotStateReceiver);
|
||||
}
|
||||
|
||||
@Override public void onDestroy() {
|
||||
unregisterReceiver(hotspotStateReceiver);
|
||||
super.onDestroy();
|
||||
}
|
||||
|
||||
@Override public int onStartCommand(@NonNull Intent intent, int flags, int startId) {
|
||||
switch (intent.getAction()) {
|
||||
|
||||
case ACTION_TOGGLE_HOTSPOT:
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
if (hotspotManager.isHotspotStarted()) {
|
||||
stopHotspotAndDismissNotification();
|
||||
} else {
|
||||
if (zimHostCallbacks != null) {
|
||||
zimHostCallbacks.requestLocationAccess();
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case ACTION_LOCATION_ACCESS_GRANTED:
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
hotspotManager.turnOnHotspot();
|
||||
}
|
||||
break;
|
||||
|
||||
case ACTION_START_SERVER:
|
||||
if (webServerHelper.startServerHelper(
|
||||
intent.getStringArrayListExtra(SELECTED_ZIM_PATHS_KEY))) {
|
||||
if (zimHostCallbacks != null) {
|
||||
zimHostCallbacks.onServerStarted(ServerUtils.getSocketAddress());
|
||||
}
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
|
||||
startForegroundNotificationHelper();
|
||||
}
|
||||
zimHostCallbacks.onServerStarted(ServerUtils.getSocketAddress());
|
||||
startForegroundNotificationHelper();
|
||||
Toast.makeText(this, R.string.server_started__successfully_toast_message,
|
||||
Toast.LENGTH_SHORT).show();
|
||||
} else {
|
||||
if (zimHostCallbacks != null) {
|
||||
zimHostCallbacks.onServerFailedToStart();
|
||||
}
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
stopForeground(true);
|
||||
stopSelf();
|
||||
hotspotNotificationManager.dismissNotification();
|
||||
}
|
||||
zimHostCallbacks.onServerFailedToStart();
|
||||
}
|
||||
|
||||
break;
|
||||
@ -116,17 +91,13 @@ public class HotspotService extends Service implements HotspotStateListener, IpA
|
||||
|
||||
//Dismiss notification and turn off hotspot for devices>=O
|
||||
private void stopHotspotAndDismissNotification() {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
hotspotManager.turnOffHotspot();
|
||||
} else {
|
||||
webServerHelper.stopAndroidWebServer();
|
||||
if (zimHostCallbacks != null) {
|
||||
zimHostCallbacks.onServerStopped();
|
||||
}
|
||||
stopForeground(true);
|
||||
stopSelf();
|
||||
hotspotNotificationManager.dismissNotification();
|
||||
webServerHelper.stopAndroidWebServer();
|
||||
if (zimHostCallbacks != null) {
|
||||
zimHostCallbacks.onServerStopped();
|
||||
}
|
||||
stopForeground(true);
|
||||
stopSelf();
|
||||
hotspotNotificationManager.dismissNotification();
|
||||
}
|
||||
|
||||
public void registerCallBack(@Nullable ZimHostCallbacks myCallback) {
|
||||
@ -138,29 +109,6 @@ public class HotspotService extends Service implements HotspotStateListener, IpA
|
||||
hotspotNotificationManager.buildForegroundNotification());
|
||||
}
|
||||
|
||||
@Override public void onHotspotTurnedOn(@NonNull WifiConfiguration wifiConfiguration) {
|
||||
startForegroundNotificationHelper();
|
||||
if (zimHostCallbacks != null) {
|
||||
zimHostCallbacks.onHotspotTurnedOn(wifiConfiguration);
|
||||
}
|
||||
}
|
||||
|
||||
@Override public void onHotspotFailedToStart() {
|
||||
if (zimHostCallbacks != null) {
|
||||
zimHostCallbacks.onHotspotFailedToStart();
|
||||
}
|
||||
}
|
||||
|
||||
@Override public void onHotspotStopped() {
|
||||
webServerHelper.stopAndroidWebServer();
|
||||
if (zimHostCallbacks != null) {
|
||||
zimHostCallbacks.onServerStopped();
|
||||
}
|
||||
stopForeground(true);
|
||||
stopSelf();
|
||||
hotspotNotificationManager.dismissNotification();
|
||||
}
|
||||
|
||||
@Override public void onIpAddressValid() {
|
||||
if (zimHostCallbacks != null) {
|
||||
zimHostCallbacks.onIpAddressValid();
|
||||
@ -173,6 +121,10 @@ public class HotspotService extends Service implements HotspotStateListener, IpA
|
||||
}
|
||||
}
|
||||
|
||||
@Override public void onHotspotDisabled() {
|
||||
stopHotspotAndDismissNotification();
|
||||
}
|
||||
|
||||
public class HotspotBinder extends Binder {
|
||||
|
||||
@NonNull public HotspotService getService() {
|
||||
|
@ -1,12 +0,0 @@
|
||||
package org.kiwix.kiwixmobile.wifi_hotspot;
|
||||
|
||||
import android.net.wifi.WifiConfiguration;
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
public interface HotspotStateListener {
|
||||
void onHotspotTurnedOn(@NonNull WifiConfiguration wifiConfiguration);
|
||||
|
||||
void onHotspotFailedToStart();
|
||||
|
||||
void onHotspotStopped();
|
||||
}
|
@ -0,0 +1,63 @@
|
||||
/*
|
||||
* Kiwix Android
|
||||
* Copyright (C) 2018 Kiwix <android.kiwix.org>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package org.kiwix.kiwixmobile.wifi_hotspot
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import org.kiwix.kiwixmobile.wifi_hotspot.HotspotStateReceiver.HotspotState.DISABLED
|
||||
import org.kiwix.kiwixmobile.zim_manager.BaseBroadcastReceiver
|
||||
import javax.inject.Inject
|
||||
|
||||
const val EXTRA_WIFI_AP_STATE = "wifi_state"
|
||||
const val ACTION_WIFI_AP_STATE = "android.net.wifi.WIFI_AP_STATE_CHANGED"
|
||||
|
||||
const val WIFI_AP_STATE_DISABLING = 10
|
||||
const val WIFI_AP_STATE_DISABLED = 11
|
||||
const val WIFI_AP_STATE_ENABLING = 12
|
||||
const val WIFI_AP_STATE_ENABLED = 13
|
||||
const val WIFI_AP_STATE_FAILED = 14
|
||||
|
||||
class HotspotStateReceiver @Inject constructor(val callback: Callback) : BaseBroadcastReceiver() {
|
||||
override val action: String = ACTION_WIFI_AP_STATE
|
||||
|
||||
override fun onIntentWithActionReceived(context: Context, intent: Intent) {
|
||||
if (DISABLED == hotspotState(intent)) {
|
||||
callback.onHotspotDisabled()
|
||||
}
|
||||
}
|
||||
|
||||
private fun hotspotState(intent: Intent) =
|
||||
HotspotState.from(intent.getIntExtra(EXTRA_WIFI_AP_STATE, -1))
|
||||
|
||||
interface Callback {
|
||||
fun onHotspotDisabled()
|
||||
}
|
||||
|
||||
private enum class HotspotState(val state: Int) {
|
||||
|
||||
DISABLING(WIFI_AP_STATE_DISABLING),
|
||||
DISABLED(WIFI_AP_STATE_DISABLED),
|
||||
ENABLING(WIFI_AP_STATE_ENABLING),
|
||||
ENABLED(WIFI_AP_STATE_ENABLED),
|
||||
FAILED(WIFI_AP_STATE_FAILED);
|
||||
|
||||
companion object {
|
||||
fun from(state: Int) = HotspotState.values().firstOrNull { state == it.state }
|
||||
}
|
||||
}
|
||||
}
|
@ -1,86 +0,0 @@
|
||||
package org.kiwix.kiwixmobile.wifi_hotspot;
|
||||
|
||||
import android.net.wifi.WifiConfiguration;
|
||||
import android.net.wifi.WifiManager;
|
||||
import android.os.Build;
|
||||
import android.os.Handler;
|
||||
import android.util.Log;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.RequiresApi;
|
||||
import javax.inject.Inject;
|
||||
|
||||
/**
|
||||
* WifiHotstopManager class makes use of the Android's WifiManager and WifiConfiguration class
|
||||
* to implement the wifi hotspot feature.
|
||||
* Created by Adeel Zafar on 28/5/2019.
|
||||
*/
|
||||
|
||||
public class WifiHotspotManager {
|
||||
private static final String TAG = "WifiHotspotManager";
|
||||
private WifiManager wifiManager;
|
||||
private WifiManager.LocalOnlyHotspotReservation hotspotReservation;
|
||||
private HotspotStateListener hotspotStateListener;
|
||||
|
||||
@Inject
|
||||
public WifiHotspotManager(@NonNull WifiManager wifiManager,
|
||||
@NonNull HotspotStateListener hotspotStateListener) {
|
||||
this.wifiManager = wifiManager;
|
||||
this.hotspotStateListener = hotspotStateListener;
|
||||
}
|
||||
|
||||
//Workaround to turn on hotspot for Oreo versions
|
||||
@RequiresApi(api = Build.VERSION_CODES.O)
|
||||
public void turnOnHotspot() {
|
||||
wifiManager.startLocalOnlyHotspot(new WifiManager.LocalOnlyHotspotCallback() {
|
||||
|
||||
@Override
|
||||
public void onStarted(WifiManager.LocalOnlyHotspotReservation reservation) {
|
||||
super.onStarted(reservation);
|
||||
hotspotReservation = reservation;
|
||||
WifiConfiguration currentConfig = hotspotReservation.getWifiConfiguration();
|
||||
|
||||
printCurrentConfig(currentConfig);
|
||||
hotspotStateListener.onHotspotTurnedOn(currentConfig);
|
||||
Log.v(TAG, "Local Hotspot Started");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStopped() {
|
||||
super.onStopped();
|
||||
hotspotStateListener.onHotspotStopped();
|
||||
Log.v(TAG, "Local Hotspot Stopped");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailed(int reason) {
|
||||
super.onFailed(reason);
|
||||
hotspotStateListener.onHotspotFailedToStart();
|
||||
Log.v(TAG, "Local Hotspot failed to start");
|
||||
}
|
||||
}, new Handler());
|
||||
}
|
||||
|
||||
//Workaround to turn off hotspot for Oreo versions
|
||||
@RequiresApi(api = Build.VERSION_CODES.O)
|
||||
public void turnOffHotspot() {
|
||||
if (hotspotReservation != null) {
|
||||
hotspotReservation.close();
|
||||
hotspotReservation = null;
|
||||
hotspotStateListener.onHotspotStopped();
|
||||
Log.v(TAG, "Turned off hotspot");
|
||||
}
|
||||
}
|
||||
|
||||
//This method checks the state of the hostpot for devices>=Oreo
|
||||
@RequiresApi(api = Build.VERSION_CODES.O)
|
||||
public boolean isHotspotStarted() {
|
||||
return hotspotReservation != null;
|
||||
}
|
||||
|
||||
private void printCurrentConfig(WifiConfiguration wifiConfiguration) {
|
||||
Log.v(TAG, "THE PASSWORD IS: "
|
||||
+ wifiConfiguration.preSharedKey
|
||||
+ " \n SSID is : "
|
||||
+ wifiConfiguration.SSID);
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user