1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_KEYBOARD_ACCESSORY_ANDROID_MANUAL_FILLING_CONTROLLER_H_
#define CHROME_BROWSER_KEYBOARD_ACCESSORY_ANDROID_MANUAL_FILLING_CONTROLLER_H_
#include "base/memory/weak_ptr.h"
#include "base/types/strong_alias.h"
#include "chrome/browser/keyboard_accessory/android/accessory_sheet_data.h"
#include "chrome/browser/keyboard_accessory/android/accessory_sheet_enums.h"
#include "components/autofill/core/common/mojom/autofill_types.mojom-forward.h"
#include "components/autofill/core/common/unique_ids.h"
#include "content/public/browser/web_contents_user_data.h"
// Controller interface for the view that includes the keyboard accessory and
// the accessory sheet below it. Implementations of this interface create and
// own a ManualFillingViewInterface.
//
// The manual filling controller forwards requests from type-specific accessory
// controllers (Passwords and Autofill) to the view. The view notifies this
// controller about interactions (such as requesting to fill a password
// suggestion) and forwards the request to the corresponding type-specific
// accessory controller.
//
// This controller also implements the logic to show/hide the keyboard
// accessory.
//
// ManualFillingController::GetOrCreate() should be used
// by type-specific controllers to obtain an instance of this class for a given
// WebContents. There is only one instance per WebContents, which is created the
// first time |GetOrCreate()| is invoked.
//
// Usage example:
// auto controller = ManualFillingController::GetOrCreate(web_contents);
// DCHECK(controller);
// controller->RefreshSuggestionsForField(...);
class ManualFillingController {
public:
// The controller checks if at least one of these sources needs the accessory
// to be displayed.
enum class FillingSource {
AUTOFILL,
PASSWORD_FALLBACKS,
CREDIT_CARD_FALLBACKS,
ADDRESS_FALLBACKS,
};
using ShouldShowAction = base::StrongAlias<struct ShouldShowActionTag, bool>;
ManualFillingController() = default;
ManualFillingController(const ManualFillingController&) = delete;
ManualFillingController& operator=(const ManualFillingController&) = delete;
virtual ~ManualFillingController() = default;
// Returns a weak pointer to the unique ManualFillingController instance
// associated with a WebContents. The first invocation creates an instance
// and attaches it to the WebContents; the same instance is returned by all
// future invocations for the same WebContents.
static base::WeakPtr<ManualFillingController> GetOrCreate(
content::WebContents* contents);
// Returns a weak pointer to the unique ManualFillingController instance
// associated with a WebContents.
static base::WeakPtr<ManualFillingController> Get(
content::WebContents* contents);
// --------------------------------------------
// Methods called by type-specific controllers.
// --------------------------------------------
// Notifies that the focused field changed which allows the controller to
// update the UI visibility.
virtual void NotifyFocusedInputChanged(
autofill::FieldRendererId focused_field_id,
autofill::mojom::FocusedFieldType focused_field_type) = 0;
// Returns the last field id passed to `NotifyFocusedInputChanged()`.
// TODO: crbug.com/327838324 - Remove this method from the public interface.
virtual autofill::FieldGlobalId GetLastFocusedFieldId() const = 0;
// Reports for a source whether it provides suggestions or just default
// options. The controller then updates the UI visibility accordingly.
// TODO(crbug.com/40165275): Use
// AccessoryController::RegisterFillingSourceObserver to get this signal from
// sheet controllers.
virtual void UpdateSourceAvailability(FillingSource source,
bool has_suggestions) = 0;
// Explicitly hides all manual filling UI without checking any filling source.
// E.g. after autofilling suggestions, or generating a password.
virtual void Hide() = 0;
// Notifies the view that availability of the given action changed.
virtual void OnAccessoryActionAvailabilityChanged(
ShouldShowAction shouldShowAction,
autofill::AccessoryAction action) = 0;
// Instructs the view to show the manual filling sheet for the given
// |tab_type|.
virtual void ShowAccessorySheetTab(
const autofill::AccessoryTabType& tab_type) = 0;
// --------------------------
// Methods called by UI code:
// --------------------------
// Called by the UI code to request that |text_to_fill| is to be filled into
// the currently focused field. Forwards the request to a type-specific
// accessory controller.
virtual void OnFillingTriggered(
autofill::AccessoryTabType type,
const autofill::AccessorySheetField& selection) = 0;
// Called by the UI code to request that `passkey_id` should be used to
// authenticate the user.
virtual void OnPasskeySelected(autofill::AccessoryTabType type,
const std::vector<uint8_t>& passkey_id) = 0;
// Called by the UI code because a user triggered the |selected_action|,
// such as "Manage passwords...".
virtual void OnOptionSelected(
autofill::AccessoryAction selected_action) const = 0;
// Called by the UI code because a user toggled the |toggled_action|,
// such as "Save passwords for this site".
virtual void OnToggleChanged(autofill::AccessoryAction toggled_action,
bool enabled) const = 0;
// Called by the UI to explicitly request a new sheet of the given type.
virtual void RequestAccessorySheet(
autofill::AccessoryTabType tab_type,
base::OnceCallback<void(autofill::AccessorySheetData)> callback) = 0;
// -----------------
// Member accessors:
// -----------------
// The web page view containing the focused field.
virtual gfx::NativeView container_view() const = 0;
};
#endif // CHROME_BROWSER_KEYBOARD_ACCESSORY_ANDROID_MANUAL_FILLING_CONTROLLER_H_
|