Esempio n. 1
0
        public override bool Execute()
        {
            Log.LogMessage("Started ProcessGoogleServicesJson...");

            var resPath       = ResPath.GetMetadata("FullPath");
            var stampPath     = StampPath.GetMetadata("FullPath");
            var resValuesPath = ResStringsPath.GetMetadata("FullPath");
            var resXmlPath    = ResXmlPath.GetMetadata("FullPath");

            Log.LogMessage("Android Package Name: {0}", AndroidPackageName);
            Log.LogMessage("Resource Path: {0}", resPath);
            Log.LogMessage("Resource Strings Path: {0}", resValuesPath);
            Log.LogMessage("Resource Xml Path: {0}", resXmlPath);
            Log.LogMessage("Stamp Path: {0}", stampPath);

            // Return out the absolute path of our resources dir
            ResPathAbs = new ITaskItem[] { new TaskItem(resPath) };

            if (GoogleServicesJsons == null || !GoogleServicesJsons.Any())
            {
                Log.LogMessage("No GoogleServicesJson Build Action items specified, skipping task.");
                DeleteFiles(resValuesPath, resXmlPath);
                return(true);
            }

            if (GoogleServicesJsons.Count() > 1)
            {
                Log.LogMessage("More than one GoogleServicesJson file specified for build configuration, using first one found.");
            }

            var gsItem = GoogleServicesJsons.First();

            var gsPath = CleanPath(gsItem.ItemSpec);

            GoogleServices googleServices;

            try {
                using (var sr = File.OpenRead(gsPath))
                    googleServices = GoogleServicesJsonProcessor.ProcessJson(AndroidPackageName, sr);

                if (googleServices == null)
                {
                    throw new NullReferenceException();
                }
            } catch (Exception ex) {
                Log.LogError("Failed to Read or Deserialize GoogleServicesJson file: {0}{1}{2}", gsPath, Environment.NewLine, ex);
                DeleteFiles(resValuesPath, resXmlPath);
                return(false);
            }

            if (string.IsNullOrEmpty(AndroidPackageName))
            {
                Log.LogError("Android Package Name not specified for project");
                return(false);
            }

            var resolvedClientInfo = googleServices.GetClient(AndroidPackageName);

            if (resolvedClientInfo == null)
            {
                Log.LogWarning("Failed to find client_info in google-services.json matching package name: {0}", AndroidPackageName);
            }

            var valuesItems = new Dictionary <string, string> {
                { "ga_trackingId", googleServices.GetGATrackingId(AndroidPackageName) },
                { "gcm_defaultSenderId", googleServices.GetDefaultGcmSenderId() },
                { "google_app_id", googleServices.GetGoogleAppId(AndroidPackageName) },
                { "test_banner_ad_unit_id", googleServices.GetTestBannerAdUnitId(AndroidPackageName) },
                { "test_interstitial_ad_unit_id", googleServices.GetTestInterstitialAdUnitId(AndroidPackageName) },
                { "default_web_client_id", googleServices.GetDefaultWebClientId(AndroidPackageName) },
                { "firebase_database_url", googleServices.GetFirebaseDatabaseUrl() },
                { "google_api_key", googleServices.GetGoogleApiKey(AndroidPackageName) },
                { "google_crash_reporting_api_key", googleServices.GetCrashReportingApiKey(AndroidPackageName) },
                { "google_storage_bucket", googleServices.GetStorageBucket(AndroidPackageName) },
                { "project_id", googleServices.ProjectInfo.ProjectId }
            };

            // We only want to create the file if not all of these values are missing
            if (valuesItems.Any(kvp => !string.IsNullOrEmpty(kvp.Value)))
            {
                Log.LogMessage("Writing Resource File: {0}", resValuesPath);
                WriteResourceDoc(resValuesPath, valuesItems);
                Log.LogMessage("Wrote Resource File: {0}", resValuesPath);
            }
            else
            {
                if (File.Exists(resValuesPath))
                {
                    Log.LogMessage("Deleting Resource File: {0}", resValuesPath);
                    try {
                        File.Delete(resValuesPath);
                    } catch (Exception ex) {
                        Log.LogWarning("Failed to delete Resource File: {0}{1}{2}", resValuesPath, Environment.NewLine, ex);
                    }
                }
            }

            var xmlItems = new Dictionary <string, string> {
                { "ga_trackingId", googleServices.GetGATrackingId(AndroidPackageName) }
            };

            // We only want to create the file if not all of these values are missing
            if (xmlItems.Any(kvp => !string.IsNullOrEmpty(kvp.Value)))
            {
                Log.LogMessage("Writing Resource File: {0}", resXmlPath);
                WriteResourceDoc(resXmlPath, xmlItems);
                Log.LogMessage("Wrote Resource File: {0}", resXmlPath);
            }
            else
            {
                // If no
                if (File.Exists(resXmlPath))
                {
                    Log.LogMessage("Deleting Resource File: {0}", resXmlPath);
                    try {
                        File.Delete(resXmlPath);
                    } catch (Exception ex) {
                        Log.LogWarning("Failed to delete Resource File: {0}{1}{2}", resXmlPath, Environment.NewLine, ex);
                    }
                }
            }

            var stampTxt = string.Empty;

            if (File.Exists(resXmlPath))
            {
                stampTxt += resXmlPath + Environment.NewLine;
            }
            if (File.Exists(resValuesPath))
            {
                stampTxt += resValuesPath + Environment.NewLine;
            }

            File.WriteAllText(stampPath, stampTxt);

            Log.LogMessage("Finished ProcessGoogleServicesJson...");
            return(true);
        }