diff --git a/app/detekt_baseline.xml b/app/detekt_baseline.xml index 371c51fad..ea15dff69 100644 --- a/app/detekt_baseline.xml +++ b/app/detekt_baseline.xml @@ -28,6 +28,7 @@ PackageNaming:HotspotNotificationManager.kt$package org.kiwix.kiwixmobile.webserver.wifi_hotspot PackageNaming:HotspotStateReceiver.kt$package org.kiwix.kiwixmobile.webserver.wifi_hotspot PackageNaming:IpAddressCallbacks.kt$package org.kiwix.kiwixmobile.webserver.wifi_hotspot + PackageNaming:HotspotService.kt$package org.kiwix.kiwixmobile.webserver.wifi_hotspot PackageNaming:LibraryAdapter.kt$package org.kiwix.kiwixmobile.zimManager.libraryView.adapter PackageNaming:LibraryDelegate.kt$package diff --git a/app/src/main/java/org/kiwix/kiwixmobile/webserver/ZimHostFragment.kt b/app/src/main/java/org/kiwix/kiwixmobile/webserver/ZimHostFragment.kt index b7d9a4af5..8c01b0492 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/webserver/ZimHostFragment.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/webserver/ZimHostFragment.kt @@ -60,9 +60,9 @@ import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.adapter.BooksOnDis import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.adapter.BooksOnDiskListItem.BookOnDisk import org.kiwix.kiwixmobile.main.KiwixMainActivity import org.kiwix.kiwixmobile.webserver.wifi_hotspot.HotspotService -import org.kiwix.kiwixmobile.webserver.wifi_hotspot.HotspotService.ACTION_CHECK_IP_ADDRESS -import org.kiwix.kiwixmobile.webserver.wifi_hotspot.HotspotService.ACTION_START_SERVER -import org.kiwix.kiwixmobile.webserver.wifi_hotspot.HotspotService.ACTION_STOP_SERVER +import org.kiwix.kiwixmobile.webserver.wifi_hotspot.HotspotService.Companion.ACTION_CHECK_IP_ADDRESS +import org.kiwix.kiwixmobile.webserver.wifi_hotspot.HotspotService.Companion.ACTION_START_SERVER +import org.kiwix.kiwixmobile.webserver.wifi_hotspot.HotspotService.Companion.ACTION_STOP_SERVER import javax.inject.Inject class ZimHostFragment : BaseFragment(), ZimHostCallbacks, ZimHostContract.View { @@ -135,7 +135,7 @@ class ZimHostFragment : BaseFragment(), ZimHostCallbacks, ZimHostContract.View { override fun onServiceConnected(className: ComponentName, service: IBinder) { hotspotService = (service as HotspotService.HotspotBinder).service - hotspotService!!.registerCallBack(this@ZimHostFragment) + hotspotService?.registerCallBack(this@ZimHostFragment) } } @@ -417,7 +417,7 @@ class ZimHostFragment : BaseFragment(), ZimHostCallbacks, ZimHostContract.View { } override fun onIpAddressValid() { - progressDialog!!.dismiss() + progressDialog?.dismiss() requireActivity().startService( createHotspotIntent(ACTION_START_SERVER).putStringArrayListExtra( SELECTED_ZIM_PATHS_KEY, selectedBooksPath @@ -426,7 +426,7 @@ class ZimHostFragment : BaseFragment(), ZimHostCallbacks, ZimHostContract.View { } override fun onIpAddressInvalid() { - progressDialog!!.dismiss() + progressDialog?.dismiss() toast(R.string.server_failed_message, Toast.LENGTH_SHORT) } diff --git a/app/src/main/java/org/kiwix/kiwixmobile/webserver/wifi_hotspot/HotspotService.java b/app/src/main/java/org/kiwix/kiwixmobile/webserver/wifi_hotspot/HotspotService.java deleted file mode 100644 index 3c074397f..000000000 --- a/app/src/main/java/org/kiwix/kiwixmobile/webserver/wifi_hotspot/HotspotService.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Kiwix Android - * Copyright (c) 2019 Kiwix - * 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 . - * - */ - -package org.kiwix.kiwixmobile.webserver.wifi_hotspot; - -import android.app.Service; -import android.content.Intent; -import android.os.Binder; -import android.os.IBinder; -import android.widget.Toast; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import javax.inject.Inject; -import org.kiwix.kiwixmobile.KiwixApp; -import org.kiwix.kiwixmobile.core.R; -import org.kiwix.kiwixmobile.core.extensions.ContextExtensionsKt; -import org.kiwix.kiwixmobile.core.utils.ServerUtils; -import org.kiwix.kiwixmobile.webserver.WebServerHelper; -import org.kiwix.kiwixmobile.webserver.ZimHostCallbacks; - -import static org.kiwix.kiwixmobile.webserver.ZimHostFragment.SELECTED_ZIM_PATHS_KEY; -import static org.kiwix.kiwixmobile.webserver.wifi_hotspot.HotspotNotificationManager.HOTSPOT_NOTIFICATION_ID; - -/** - * HotspotService is used to add a foreground service for the wifi hotspot. - * Created by Adeel Zafar on 07/01/2019. - */ - -public class HotspotService extends Service - implements IpAddressCallbacks, HotspotStateReceiver.Callback { - - 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"; - - private ZimHostCallbacks zimHostCallbacks; - private final IBinder serviceBinder = new HotspotBinder(); - - @Inject - WebServerHelper webServerHelper; - @Inject - HotspotNotificationManager hotspotNotificationManager; - @Inject - HotspotStateReceiver hotspotStateReceiver; - - @Override public void onCreate() { - ((KiwixApp) this.getApplicationContext()).getKiwixComponent() - .serviceComponent() - .service(this) - .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_START_SERVER: - if (webServerHelper.startServerHelper( - intent.getStringArrayListExtra(SELECTED_ZIM_PATHS_KEY))) { - zimHostCallbacks.onServerStarted(ServerUtils.getSocketAddress()); - startForegroundNotificationHelper(); - Toast.makeText(this, R.string.server_started_successfully_toast_message, - Toast.LENGTH_SHORT).show(); - } else { - zimHostCallbacks.onServerFailedToStart(); - } - - break; - - case ACTION_STOP_SERVER: - Toast.makeText(this, R.string.server_stopped_successfully_toast_message, - Toast.LENGTH_SHORT).show(); - stopHotspotAndDismissNotification(); - break; - - case ACTION_CHECK_IP_ADDRESS: - webServerHelper.pollForValidIpAddress(); - break; - - default: - break; - } - return START_NOT_STICKY; - } - - @Nullable @Override public IBinder onBind(@Nullable Intent intent) { - return serviceBinder; - } - - //Dismiss notification and turn off hotspot for devices>=O - private void stopHotspotAndDismissNotification() { - webServerHelper.stopAndroidWebServer(); - if (zimHostCallbacks != null) { - zimHostCallbacks.onServerStopped(); - } - stopForeground(true); - stopSelf(); - hotspotNotificationManager.dismissNotification(); - } - - public void registerCallBack(@Nullable ZimHostCallbacks myCallback) { - zimHostCallbacks = myCallback; - } - - private void startForegroundNotificationHelper() { - startForeground(HOTSPOT_NOTIFICATION_ID, - hotspotNotificationManager.buildForegroundNotification()); - } - - @Override public void onIpAddressValid() { - if (zimHostCallbacks != null) { - zimHostCallbacks.onIpAddressValid(); - } - } - - @Override public void onIpAddressInvalid() { - if (zimHostCallbacks != null) { - zimHostCallbacks.onIpAddressInvalid(); - } - } - - @Override public void onHotspotDisabled() { - stopHotspotAndDismissNotification(); - } - - public class HotspotBinder extends Binder { - - @NonNull public HotspotService getService() { - return HotspotService.this; - } - } -} diff --git a/app/src/main/java/org/kiwix/kiwixmobile/webserver/wifi_hotspot/HotspotService.kt b/app/src/main/java/org/kiwix/kiwixmobile/webserver/wifi_hotspot/HotspotService.kt new file mode 100644 index 000000000..dd32022be --- /dev/null +++ b/app/src/main/java/org/kiwix/kiwixmobile/webserver/wifi_hotspot/HotspotService.kt @@ -0,0 +1,149 @@ +/* + * Kiwix Android + * Copyright (c) 2019 Kiwix + * 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 . + * + */ +package org.kiwix.kiwixmobile.webserver.wifi_hotspot + +import android.app.Service +import android.content.Intent +import android.os.Binder +import android.os.Build +import android.os.IBinder +import android.widget.Toast +import org.kiwix.kiwixmobile.KiwixApp +import org.kiwix.kiwixmobile.core.R +import org.kiwix.kiwixmobile.core.extensions.registerReceiver +import org.kiwix.kiwixmobile.core.utils.ServerUtils.getSocketAddress +import org.kiwix.kiwixmobile.webserver.WebServerHelper +import org.kiwix.kiwixmobile.webserver.ZimHostCallbacks +import org.kiwix.kiwixmobile.webserver.ZimHostFragment +import javax.inject.Inject + +/** + * HotspotService is used to add a foreground service for the wifi hotspot. + * Created by Adeel Zafar on 07/01/2019. + */ +class HotspotService : + Service(), + IpAddressCallbacks, + HotspotStateReceiver.Callback { + @set:Inject + var webServerHelper: WebServerHelper? = null + + @set:Inject + var hotspotNotificationManager: HotspotNotificationManager? = null + + @set:Inject + var hotspotStateReceiver: HotspotStateReceiver? = null + + private var zimHostCallbacks: ZimHostCallbacks? = null + private val serviceBinder: IBinder = HotspotBinder() + + override fun onCreate() { + (this.application as KiwixApp).kiwixComponent + .serviceComponent() + .service(this) + .build() + .inject(this) + super.onCreate() + hotspotStateReceiver?.let(this::registerReceiver) + } + + override fun onDestroy() { + hotspotStateReceiver?.let(this@HotspotService::unregisterReceiver) + super.onDestroy() + } + + override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { + when (intent.action) { + ACTION_START_SERVER -> + intent.getStringArrayListExtra(ZimHostFragment.SELECTED_ZIM_PATHS_KEY)?.let { + if (webServerHelper?.startServerHelper(it) == true) { + zimHostCallbacks?.onServerStarted(getSocketAddress()) + startForegroundNotificationHelper() + Toast.makeText( + this, R.string.server_started_successfully_toast_message, + Toast.LENGTH_SHORT + ).show() + } else { + onServerFailedToStart() + } + } ?: kotlin.run(::onServerFailedToStart) + ACTION_STOP_SERVER -> { + Toast.makeText( + this, R.string.server_stopped_successfully_toast_message, + Toast.LENGTH_SHORT + ).show() + stopHotspotAndDismissNotification() + } + ACTION_CHECK_IP_ADDRESS -> webServerHelper?.pollForValidIpAddress() + else -> {} + } + return START_NOT_STICKY + } + + override fun onBind(intent: Intent?): IBinder = serviceBinder + + // Dismiss notification and turn off hotspot for devices>=O + private fun stopHotspotAndDismissNotification() { + webServerHelper?.stopAndroidWebServer() + zimHostCallbacks?.onServerStopped() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + stopForeground(STOP_FOREGROUND_REMOVE) + } + stopSelf() + hotspotStateReceiver = null + hotspotNotificationManager?.dismissNotification() + } + + private fun onServerFailedToStart() { + zimHostCallbacks?.onServerFailedToStart() + } + + fun registerCallBack(myCallback: ZimHostCallbacks?) { + zimHostCallbacks = myCallback + } + + private fun startForegroundNotificationHelper() { + startForeground( + HotspotNotificationManager.HOTSPOT_NOTIFICATION_ID, + hotspotNotificationManager?.buildForegroundNotification() + ) + } + + override fun onIpAddressValid() { + zimHostCallbacks?.onIpAddressValid() + } + + override fun onIpAddressInvalid() { + zimHostCallbacks?.onIpAddressInvalid() + } + + override fun onHotspotDisabled() { + stopHotspotAndDismissNotification() + } + + inner class HotspotBinder : Binder() { + val service: HotspotService + get() = this@HotspotService + } + + companion object { + const val ACTION_START_SERVER = "start_server" + const val ACTION_STOP_SERVER = "stop_server" + const val ACTION_CHECK_IP_ADDRESS = "check_ip_address" + } +}