Tap on Android camera Flutter driver

Viewed 305

Im doing an integration test in Flutter and in the application I open the camera, but I don't know how to tap on the button to do the photo, anyone know how can I search for this button?

Here is the code if the app where you can choose between pic a photo with the camera or choose one picture of your gallery

import 'dart:io';
import 'package:permission_handler/permission_handler.dart';
import 'package:random_string/random_string.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:image_cropper/image_cropper.dart';
import 'package:image_picker/image_picker.dart';
import 'package:modal_progress_hud/modal_progress_hud.dart';
import 'package:rosita/language/firebase_remote.dart';
import 'package:rosita/api/api_provider.dart';
import 'package:rosita/constants/common.dart';
import 'package:rosita/model/image_object.dart';
import 'package:rosita/model/senior_user.dart';
import 'package:rosita/modules/widgets/button_ui.dart';
import 'package:rosita/rosita.dart';

class AddProfileImageScreen extends StatefulWidget {
  const AddProfileImageScreen({Key key, this.seniorUser}) : super(key: key);

  final SeniorUser seniorUser;

  @override
  _AddProfileImageScreenState createState() => _AddProfileImageScreenState();
}

class _AddProfileImageScreenState extends State<AddProfileImageScreen> {
  bool _isProcessing = false;
  File _image;
  bool _enableButton = false;

  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Theme.of(context).scaffoldBackgroundColor,
      body: ModalProgressHUD(
        inAsyncCall: _isProcessing,
        color: Colors.transparent,
        progressIndicator: const CircularProgressIndicator(
          strokeWidth: 2.0,
        ),
        child: Container(
          padding: EdgeInsets.only(top: MediaQuery.of(context).padding.top),
          constraints: BoxConstraints(
              minHeight: MediaQuery.of(context).size.height,
              minWidth: MediaQuery.of(context).size.width),
          child: Padding(
            padding: const EdgeInsets.all(24),
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                darkSubtitleText('choose_profile_picture', context),
                Expanded(
                  child: Center(
                    child: SizedBox(
                      width: 100,
                      height: 100,
                      child: Card(
                        shape: RoundedRectangleBorder(
                          side: const BorderSide(
                            color: AppTheme.purpleColor,
                            width: 4,
                          ),
                          borderRadius: BorderRadius.circular(60.0),
                        ),
                        elevation: 0,
                        color: Theme.of(context).dividerColor,
                        child: _image == null
                            ? (widget.seniorUser != null &&
                                    widget.seniorUser.profileImage != null &&
                                    widget.seniorUser.profileImage.imageUrl !=
                                        '')
                                ? CachedNetworkImage(
                                    imageUrl:
                                        widget.seniorUser.profileImage.imageUrl,
                                    placeholder:
                                        (BuildContext context, String url) =>
                                            Image.asset(ConstantsData.appIcon),
                                    errorWidget: (BuildContext context,
                                            String url, error) =>
                                        const Icon(Icons.error),
                                    fit: BoxFit.cover,
                                  )
                                : Image.asset(ConstantsData.appIcon)
                            : Image.file(_image),
                      ),
                    ),
                  ),
                ),
                ButtonUI(
                  buttonName: 'ProfilePhotoFromCameraButton',
                  key: const Key(Keys.cameraButton),
                  isTrack: true,
                  color: AppTheme.primaryColor,
                  body: Center(
                    child: Padding(
                      padding: const EdgeInsets.all(16.0),
                      child: Text(
                        FireText.of('take_a_photo_with_your_camera'),
                        textAlign: TextAlign.center,
                        style: Theme.of(context)
                            .primaryTextTheme
                            .subtitle2
                            .copyWith(
                              color: Theme.of(context).backgroundColor,
                            ),
                      ),
                    ),
                  ),
                  onTap: () {
                    getImage(isGallery: false);
                  },
                ),
                verticalSpacer(),
                ButtonUI(
                  buttonName: 'ProfilePhotoFromGalleryButton',
                  key: const Key(Keys.galleryButton),
                  isTrack: true,
                  color: AppTheme.primaryColor,
                  body: Center(
                    child: Padding(
                      padding: const EdgeInsets.all(16.0),
                      child: Text(
                        FireText.of('choose_from_gallery'),
                        textAlign: TextAlign.center,
                        style: Theme.of(context)
                            .primaryTextTheme
                            .subtitle2
                            .copyWith(
                              color: Theme.of(context).backgroundColor,
                            ),
                      ),
                    ),
                  ),
                  onTap: () {
                    getImage(isGallery: true);
                  },
                ),
                verticalSpacer(),
                if (_image != null || _enableButton)
                  ButtonUI(
                    buttonName: 'ProfilePhotoUploadButton',
                    key: const Key(Keys.uploadButton),
                    isTrack: true,
                    color: AppTheme.purpleColor,
                    body: Center(
                      child: Padding(
                        padding: const EdgeInsets.all(16.0),
                        child: Text(
                          FireText.of('continue_txt'),
                          style: Theme.of(context)
                              .primaryTextTheme
                              .subtitle2
                              .copyWith(
                                color: Theme.of(context).backgroundColor,
                              ),
                        ),
                      ),
                    ),
                    onTap: () {
                      _uploadAllInformation();
                    },
                  ),
              ],
            ),
          ),
        ),
      ),
    );
  }

  Future<void> getImage({bool isGallery = true}) async {
    await <Permission>[Permission.camera, Permission.storage].request();
    if (await Permission.storage.status != PermissionStatus.granted) {
      setState(() {
        _enableButton = true;
      });
      return;
    }

    if (!isGallery &&
        await Permission.camera.status != PermissionStatus.granted) {
      setState(() {
        _enableButton = true;
      });
      return;
    }

    final image = await ImagePicker.pickImage(
        source: isGallery ? ImageSource.gallery : ImageSource.camera);

    if (image == null) return;

    final cropimage = await cropImage(image);
    if (cropimage == null) return;

    setState(() {
      _image = cropimage;
    });
  }

  Future<File> cropImage(File imageFile) async {
    final croppedFile = await ImageCropper.cropImage(
      androidUiSettings: AndroidUiSettings(
        statusBarColor: Theme.of(context).primaryColor,
        toolbarColor: Theme.of(context).primaryColor,
        toolbarWidgetColor: Theme.of(context).backgroundColor,
      ),
      sourcePath: imageFile.path,
      cropStyle: CropStyle.circle,
      aspectRatio: const CropAspectRatio(ratioX: 1, ratioY: 1),
      maxWidth: 420,
      maxHeight: 420,
    );
    return croppedFile;
  }

  Future<void> _uploadAllInformation() async {
    setState(() {
      _isProcessing = true;
    });
    widget.seniorUser.documentId =
        (await FirebaseAuth.instance.currentUser()).uid;
    widget.seniorUser.referralCode =
        'RO-' + randomAlphaNumeric(8).toUpperCase();
    widget.seniorUser.enterReferralCode = deepLinkReferralCode;
    await ApiProvider().createSeniorUserProfile(widget.seniorUser);
    endRegister = true;
    if (!_enableButton) {
      final imageData = await updateProfilePic(widget.seniorUser);
      await ApiProvider()
          .updateRositaProfileImage(imageData, widget.seniorUser.documentId);
    }

    setState(() {
      _isProcessing = false;
    });

    Rosita.restartApp(context);
  }

  Future<ImageObject> updateProfilePic(SeniorUser user) async {
    final imagename = DateTime.now().millisecondsSinceEpoch.toString() + '.jpg';
    final url = await ApiProvider()
        .updateProfilePic('rositapics/${user.documentId}/' + imagename, _image);
    final profileImage = ImageObject();
    profileImage.imageUrl = url.toString();
    profileImage.firebaseStoregPath =
        'rositapics/${user.documentId}/' + imagename;
    profileImage.imageName = imagename;
    return profileImage;
  }
}
0 Answers
Related