/* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.settings.wifi import android.annotation.StyleRes import android.content.Context import android.content.DialogInterface import android.os.Bundle import android.view.View import android.view.WindowManager import android.widget.Button import android.widget.ImageButton import android.widget.TextView import androidx.annotation.OpenForTesting import androidx.appcompat.app.AlertDialog import com.android.settings.R import com.android.settings.wifi.utils.WifiDialogHelper import com.android.settingslib.RestrictedLockUtils import com.android.settingslib.RestrictedLockUtilsInternal import com.android.wifitrackerlib.WifiEntry /** * Dialog for users to edit a Wi-Fi network. */ @OpenForTesting open class WifiDialog2 @JvmOverloads constructor( context: Context, private val listener: WifiDialog2Listener, val wifiEntry: WifiEntry?, private val mode: Int, @StyleRes style: Int = 0, private val hideSubmitButton: Boolean = mode == WifiConfigUiBase2.MODE_VIEW, private val hideMeteredAndPrivacy: Boolean = false, private val isSysUiCaller: Boolean = false, ) : AlertDialog(context, style), WifiConfigUiBase2, DialogInterface.OnClickListener { /** * Host UI component of WifiDialog2 can receive callbacks by this interface. */ interface WifiDialog2Listener { /** * To forget the Wi-Fi network. */ fun onForget(dialog: WifiDialog2) {} /** * To save the Wi-Fi network. */ fun onSubmit(dialog: WifiDialog2) {} /** * To trigger Wi-Fi QR code scanner. */ fun onScan(dialog: WifiDialog2, ssid: String) {} } private lateinit var view: View private lateinit var controller: WifiConfigController2 private lateinit var dialogHelper: WifiDialogHelper override fun getController(): WifiConfigController2 = controller override fun onCreate(savedInstanceState: Bundle?) { if (isSysUiCaller) { setWindowsOverlay() } view = layoutInflater.inflate(R.layout.wifi_dialog, null) setView(view) controller = WifiConfigController2(this, view, wifiEntry, mode, hideMeteredAndPrivacy) super.onCreate(savedInstanceState) if (hideSubmitButton) { controller.hideSubmitButton() } else { // During creation, the submit button can be unavailable to determine visibility. // Right after creation, update button visibility controller.enableSubmitIfAppropriate() } if (wifiEntry == null) { controller.hideForgetButton() } dialogHelper = WifiDialogHelper(this, this, controller.validator) } private fun setWindowsOverlay() { window?.apply { val lp = attributes setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG) attributes = lp } } override fun onStart() { super.onStart() val ssidScannerButton = requireViewById(R.id.ssid_scanner_button) if (hideSubmitButton) { ssidScannerButton.visibility = View.GONE } else { ssidScannerButton.setOnClickListener { val ssidEditText = requireViewById(R.id.ssid) val ssid = ssidEditText.text.toString() listener.onScan(this, ssid) } } } override fun onRestoreInstanceState(savedInstanceState: Bundle) { super.onRestoreInstanceState(savedInstanceState) controller.updatePassword() } override fun dispatchSubmit() { listener.onSubmit(this) dismiss() } override fun onClick(dialogInterface: DialogInterface, id: Int) { when (id) { BUTTON_SUBMIT -> listener.onSubmit(this) BUTTON_FORGET -> { if (WifiUtils.isNetworkLockedDown(context, wifiEntry!!.wifiConfiguration)) { RestrictedLockUtils.sendShowAdminSupportDetailsIntent( context, RestrictedLockUtilsInternal.getDeviceOwner(context) ) return } listener.onForget(this) } } } override fun getMode(): Int = mode override fun getSubmitButton(): Button? = getButton(BUTTON_SUBMIT) override fun getForgetButton(): Button? = getButton(BUTTON_FORGET) override fun getCancelButton(): Button? = getButton(BUTTON_NEGATIVE) override fun setSubmitButton(text: CharSequence) { setButton(BUTTON_SUBMIT, text, this) } override fun setForgetButton(text: CharSequence) { setButton(BUTTON_FORGET, text, this) } override fun setCancelButton(text: CharSequence) { setButton(BUTTON_NEGATIVE, text, this) } companion object { private const val BUTTON_SUBMIT = BUTTON_POSITIVE private const val BUTTON_FORGET = BUTTON_NEUTRAL } }