/* * 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.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 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() } } 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 } }