Ejemplo n.º 1
0
        public override Task <Diagonosis> Examine(PatientHistory history)
        {
            var android = new AndroidSdk.AndroidSdkManager(
                Util.GetDoctorEnvironmentVariable("ANDROID_SDK_ROOT") ?? Util.GetDoctorEnvironmentVariable("ANDROID_HOME"));

            var packages = android.SdkManager.List().InstalledPackages;

            var missingPackages = new List <Manifest.AndroidPackage>();

            foreach (var rp in RequiredPackages)
            {
                if (!packages.Any(p => p.Path.Equals(rp.Path, StringComparison.OrdinalIgnoreCase) &&
                                  NuGetVersion.Parse(p.Version) >= NuGetVersion.Parse(rp.Version)))
                {
                    ReportStatus($"{rp.Path} ({rp.Version}) missing.", Status.Error);
                    missingPackages.Add(rp);
                }
                else
                {
                    ReportStatus($"{rp.Path} ({rp.Version})", Status.Ok);
                }
            }

            if (!missingPackages.Any())
            {
                return(Task.FromResult(Diagonosis.Ok(this)));
            }

            var remedies = Util.IsMac ? new AndroidPackagesRemedy[] { new AndroidPackagesRemedy(android, missingPackages.ToArray()) } : null;

            return(Task.FromResult(new Diagonosis(
                                       Status.Error,
                                       this,
                                       new Prescription("Install missing Android SDK items",
                                                        "Your Android SDK is missing some required packages.  You can use the Android SDK Manager to install them. For more information see: https://aka.ms/dotnet-androidsdk-help",
                                                        remedies))));
        }
Ejemplo n.º 2
0
        public override Task <Diagonosis> Examine(PatientHistory history)
        {
            var android = new AndroidSdk.AndroidSdkManager(
                Util.GetDoctorEnvironmentVariable("ANDROID_SDK_ROOT") ?? Util.GetDoctorEnvironmentVariable("ANDROID_HOME"));

            try
            {
                var v = android.SdkManager.RequiresLicenseAcceptance();

                if (!v)
                {
                    ReportStatus($"All licenses accepted.", Status.Ok);
                    return(Task.FromResult(Diagonosis.Ok(this)));
                }
            }
            catch { }

            ReportStatus("One or more Licenses are not accepted.", Status.Error);

            var ext = Util.IsWindows ? ".bat" : string.Empty;

            var sdkMgrPath = android.SdkManager.FindToolPath(android.Home)?.FullName;

            if (string.IsNullOrEmpty(sdkMgrPath))
            {
                sdkMgrPath = $"sdkmanager{ext}";
            }

            return(Task.FromResult(new Diagonosis(Status.Error, this, new Prescription("Android SDK has licenses which need to be accepted.",
                                                                                       $"To read and accept Android SDK licenses, run the following command in a terminal:{Environment.NewLine}    {sdkMgrPath} --licenses"))));

            //,new ActionRemedy((r, ct) =>
            //{
            //	android.SdkManager.AcceptLicenses();
            //	return Task.CompletedTask;
            //}))));
        }
Ejemplo n.º 3
0
 public AndroidPackagesRemedy(AndroidSdk.AndroidSdkManager android, Manifest.AndroidPackage[] packages)
 {
     Android  = android;
     Packages = packages;
 }
        public override Task <DiagnosticResult> Examine(SharedState history)
        {
            var android = new AndroidSdk.AndroidSdkManager(
                history.GetEnvironmentVariable("ANDROID_SDK_ROOT") ?? history.GetEnvironmentVariable("ANDROID_HOME"));

            var avds = AndroidSdk.AvdManager.ListAvdsFromFiles();             // android.AvdManager.ListAvds();

            // This isn't really helpful anymore as avd cli tools don't seem to work with JDK 11
            //if (!avds.Any())
            //	avds = android.AvdManager.ListAvds();

            if (avds.Any())
            {
                var emu = avds.FirstOrDefault();

                ReportStatus($"Emulator: {emu.Name ?? emu.SdkId} found.", Status.Ok);

                return(Task.FromResult(DiagnosticResult.Ok(this)));
            }

            // If we got here, there are no emulators at all
            var missingEmulators = RequiredEmulators;

            if (!missingEmulators.Any())
            {
                return(Task.FromResult(DiagnosticResult.Ok(this)));
            }

            AndroidSdk.AvdManager.AvdDevice preferredDevice = null;

            try
            {
                var devices = android.AvdManager.ListDevices();

                preferredDevice = devices.FirstOrDefault(d => d.Name.Contains("pixel", StringComparison.OrdinalIgnoreCase));
            }
            catch (Exception ex)
            {
                var msg = "Unable to find any Android Emulators.  You can use Visual Studio to create one if necessary: [underline]https://docs.microsoft.com/xamarin/android/get-started/installation/android-emulator/device-manager[/]";

                ReportStatus(msg, Status.Warning);

                Util.Exception(ex);
                return(Task.FromResult(
                           new DiagnosticResult(Status.Warning, this, msg)));
            }

            return(Task.FromResult(new DiagnosticResult(
                                       Status.Error,
                                       this,
                                       new Suggestion("Create an Android Emulator",
                                                      missingEmulators.Select(me =>
                                                                              new ActionSolution(t =>
            {
                try
                {
                    var installer = new AndroidSDKInstaller(new Helper(), AndroidManifestType.GoogleV2);
                    installer.Discover();

                    var sdkInstance = installer.FindInstance(null);

                    var installedPackages = sdkInstance.Components.AllInstalled(true);

                    var sdkPackage = installedPackages.FirstOrDefault(p => p.Path.Equals(me.SdkId, StringComparison.OrdinalIgnoreCase));

                    if (sdkPackage == null && (me.AlternateSdkIds?.Any() ?? false))
                    {
                        sdkPackage = installedPackages.FirstOrDefault(p => me.AlternateSdkIds.Any(a => a.Equals(p.Path, StringComparison.OrdinalIgnoreCase)));
                    }

                    var sdkId = sdkPackage?.Path ?? me.SdkId;

                    android.AvdManager.Create($"Android_Emulator_{me.ApiLevel}", sdkId, device: preferredDevice?.Id, tag: "google_apis", force: true, interactive: true);
                    return Task.CompletedTask;
                }
                catch (Exception ex)
                {
                    ReportStatus("Unable to create Emulator.  Use Visual Studio to create one instead: https://docs.microsoft.com/xamarin/android/get-started/installation/android-emulator/device-manager", Status.Warning);
                    Util.Exception(ex);
                }

                return Task.CompletedTask;
            })).ToArray()))));
        }
Ejemplo n.º 5
0
        public override Task <DiagnosticResult> Examine(SharedState history)
        {
            var android = new AndroidSdk.AndroidSdkManager(
                history.GetEnvironmentVariable("ANDROID_SDK_ROOT") ?? history.GetEnvironmentVariable("ANDROID_HOME"));

            var avds = AndroidSdk.AvdManager.ListAvdsFromFiles();

            if (!avds.Any())
            {
                avds = android.AvdManager.ListAvds();
            }

            if (avds.Any())
            {
                var emu = avds.FirstOrDefault();

                ReportStatus($"Emulator: {emu.Name ?? emu.SdkId} found.", Status.Ok);

                return(Task.FromResult(DiagnosticResult.Ok(this)));
            }

            var missingEmulators = new List <AndroidEmulator>();

            foreach (var emu in RequiredEmulators)
            {
                var existingAvd = avds.FirstOrDefault(a => a.SdkId.Equals(emu.SdkId, StringComparison.OrdinalIgnoreCase));

                if (existingAvd == null)
                {
                    missingEmulators.Add(emu);
                    ReportStatus($"{emu.Description ?? emu.SdkId} not created.", Status.Error);
                }
                else
                {
                    ReportStatus($"{emu.Description ?? emu.SdkId} exists.", Status.Ok);
                }
            }

            if (!missingEmulators.Any())
            {
                return(Task.FromResult(DiagnosticResult.Ok(this)));
            }

            var devices = android.AvdManager.ListDevices();

            var preferredDevice = devices.FirstOrDefault(d => d.Name.Contains("pixel", StringComparison.OrdinalIgnoreCase));

            return(Task.FromResult(new DiagnosticResult(
                                       Status.Error,
                                       this,
                                       new Suggestion("Create an Android Emulator",
                                                      missingEmulators.Select(me =>
                                                                              new ActionSolution(t =>
            {
                var installer = new AndroidSDKInstaller(new Helper(), AndroidManifestType.GoogleV2);
                installer.Discover();

                var sdkInstance = installer.FindInstance(null);

                var installedPackages = sdkInstance.Components.AllInstalled(true);

                var sdkPackage = installedPackages.FirstOrDefault(p => p.Path.Equals(me.SdkId, StringComparison.OrdinalIgnoreCase));

                if (sdkPackage == null && (me.AlternateSdkIds?.Any() ?? false))
                {
                    sdkPackage = installedPackages.FirstOrDefault(p => me.AlternateSdkIds.Any(a => a.Equals(p.Path, StringComparison.OrdinalIgnoreCase)));
                }

                var sdkId = sdkPackage?.Path ?? me.SdkId;

                android.AvdManager.Create($"Android_Emulator_{me.ApiLevel}", sdkId, device: preferredDevice?.Id, tag: "google_apis", force: true, interactive: true);
                return Task.CompletedTask;
            })).ToArray()))));
        }