public GoogleIO2012Helper(object context)
        {
            this.context = context;

            try
            {
                presentationsHelper = new PresentationsHelper(context);
            }
            catch (Exception)
            {
                ((BaseActivity)context).ShowErrorMsg((context as Activity).GetText(Resource.String.ErrorNoExternalStorage));
            }

            presentationsHelper = new PresentationsHelper(context);
        }
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate (bundle);
            Logging.Log (this, Logging.LoggingTypeDebug, "OnCreate()");

            SetContentView(Resource.Layout.Edit);

            presentationsHelper = new PresentationsHelper (this);

            Display display = WindowManager.DefaultDisplay;
            Point size = new Point ();
            display.GetSize (size);
            int screenWidth = size.X;
            int screenHeight = size.Y;

            // define animations
            DefineAnimations (screenWidth);

            // set default values
            llChoosePresentation = FindViewById<LinearLayout> (Resource.Id.llChoosePresentation);
            llPresentationInfo = FindViewById<LinearLayout> (Resource.Id.llPresentationInfo);

            llChoosePresentation.SetX(0);
            llChoosePresentation.LayoutParameters = new RelativeLayout.LayoutParams (300, screenHeight);

            llPresentationInfo.SetX (300);
            llPresentationInfo.LayoutParameters = new RelativeLayout.LayoutParams (screenWidth - 300, screenHeight);

            selectedLongClickItemPosition= -1;

            lvSlides = FindViewById<ListView>(Resource.Id.lvSlides);
            lvSlides.ItemClick += LvSlides_ItemClick;

            LoadSlidesList ();

            RegisterForContextMenu(lvSlides);
        }
        public bool RenderPresentation(Guid presentationUID)
        {
            bool ret = false;
            string content = null;

            // Dateipfad zusammenbauen
            PresentationsHelper presentationHelper = new PresentationsHelper(this.context);

            string contentFolder = Path.Combine(presentationHelper.PresentationsFolder, presentationUID.ToString());
            contentFolder = Path.Combine(contentFolder, "scripts");
            contentFolder = Path.Combine(contentFolder, "md");

            // load base.html
            string baseFilename = Path.Combine(contentFolder, "base.html");

            if (!File.Exists(baseFilename))
                return false;

            // laod slides.md
            string slidesFilename = Path.Combine(contentFolder, "slides.md");

            if (!File.Exists(slidesFilename))
                return false;

            string baseContent;
            string slidesContent;

            // Dateien laden
            TextReader trBase = new StreamReader(baseFilename);
            baseContent = trBase.ReadToEnd();
            trBase.Close();

            TextReader trSlides = new StreamReader(slidesFilename);
            slidesContent = trSlides.ReadToEnd();
            trSlides.Close();

            // WebRequest
            string url = "https://ws-fp-app.appspot.com/";

            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
            request.CookieContainer = new CookieContainer();
            request.Headers.Add(HttpRequestHeader.AcceptCharset, "utf-8");
            request.Headers.Add(HttpRequestHeader.AcceptLanguage, System.Threading.Thread.CurrentThread.CurrentUICulture.Name + "," + System.Threading.Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName);
            request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;

            //Wenn ein Proxy im System eingestellt ist, diesen auch nutzen
            #if MONODROID
            string proxyHost = Android.Net.Proxy.DefaultHost;

            if(!String.IsNullOrEmpty(proxyHost))
                request.Proxy = new WebProxy(proxyHost, Android.Net.Proxy.DefaultPort);
            #endif

            // Postdaten senden
            request.Method = WebRequestMethods.Http.Post;
            request.ContentType = "application/x-www-form-urlencoded";

            string postParam = "base=" + System.Web.HttpUtility.UrlEncode(baseContent);
            postParam += "&slides=" + System.Web.HttpUtility.UrlEncode(slidesContent);

            byte[] byteArray = Encoding.UTF8.GetBytes(postParam);
            request.ContentLength = byteArray.Length;

            Stream reqStream = request.GetRequestStream();
            reqStream.Write(byteArray, 0, byteArray.Length);
            reqStream.Close();

            try
            {
                using(HttpWebResponse response = request.GetResponse() as HttpWebResponse)
                {
                    if(response.StatusCode == HttpStatusCode.OK)
                    {
                        Encoding encoding = Encoding.UTF8;

                        try
                        {
                            if (!String.IsNullOrEmpty(response.CharacterSet))
                                encoding = Encoding.GetEncoding(response.CharacterSet);
                        }
                        catch(Exception ex)
                        {
                            Logging.Log(this, Logging.LoggingTypeError, "Unbekanntes Encoding", ex);
                        }

                        using (Stream resStream = response.GetResponseStream())
                        {
                            StreamReader reader = new StreamReader(resStream, encoding);
                            content = reader.ReadToEnd();
                        }
                    }
                }
            }
            catch(WebException ex)
            {
                Logging.Log(this, Logging.LoggingTypeError, "Render Error", ex);
            }

            if (!String.IsNullOrEmpty(content))
            {
                TextWriter tw = new StreamWriter(Path.Combine(Path.Combine(new PresentationsHelper(this.context).PresentationsFolder, presentationUID.ToString()), "template.html"), false);
                tw.Write(content);
                tw.Flush();
                tw.Close();

                ret = true;
            }

            return ret;
        }
        public void RenamePresentation(Presentation presentation)
        {
            Activity activity = this.context as Activity;

            // Per Dialog den Namen der neuen Presentation abfragen
            AlertDialog.Builder dialog = new AlertDialog.Builder(activity);
            dialog.SetTitle(activity.GetText(Resource.String.DlgRenamePresentationTitle));
            dialog.SetMessage(activity.GetText(Resource.String.DlgRenamePresentationText));
            dialog.SetCancelable(true);

            EditText etName = new EditText(activity);
            etName.SetSingleLine(true);

            dialog.SetView(etName);
            dialog.SetPositiveButton(activity.GetText(Resource.String.DlgRenamePresentationErstellen), delegate {
                string name = etName.Text.Trim();

                if (String.IsNullOrEmpty(name))
                {
                    // Fehlermeldung anzeigen
                    ((BaseActivity)activity).ShowErrorMsg(activity.GetText(Resource.String.DlgPresentationErrorNoName));
                }

                try
                {
                    presentationsHelper = new PresentationsHelper(this.context);
                }
                catch (Exception)
                {
                    ((BaseActivity)activity).ShowErrorMsg(activity.GetText(Resource.String.ErrorNoExternalStorage));
                }

                presentationsHelper.Rename(presentation.PresentationUID, name);
                ListView lvSlides = activity.FindViewById<ListView>(Resource.Id.lvSlides);

                foreach (Presentation p in (((SlidesAdapter)lvSlides.Adapter).GetData))
                {
                    if (p.PresentationUID == presentation.PresentationUID)
                    {
                        p.Name = name;
                        break;
                    }
                }

                // Liste aktualisieren
                if (this.context.GetType() == typeof(EditActivity))
                {
                    EditActivity editActivity = this.context as EditActivity;
                    editActivity.LoadSlidesList();
                }
            });

            dialog.SetNegativeButton(activity.GetText(Resource.String.Cancel), delegate { });
            dialog.Show();
        }
        public Task<string> AppStartAsync()
        {
            return Task.Factory.StartNew (() => {

                // Datenbank anlegen / updaten
                new DBSchema ().UpdateDBSchema ();

            #if MONODROID
                Android.App.Activity activity = (Android.App.Activity)context;
            #endif

                PresentationsHelper presentationsHelper = null;
                try
                {
                    presentationsHelper = new PresentationsHelper (this);
                } catch (Exception ex) {
                    Logging.Log (this, Logging.LoggingTypeError, "Fehler beim instanziieren des PresentationsHelper()", ex);
            #if MONODROID
                    return activity.GetText (Resource.String.ErrorNoExternalStorage);
            #endif
                }

                DirectoryInfo dirInfo = new DirectoryInfo (presentationsHelper.PresentationsFolder);

                List<Presentation> presentations = new DBPresentation ().Select (null);

                // Nicht registrierte Präsentationen löschen
                foreach (DirectoryInfo dir in dirInfo.GetDirectories())
                {
                    if (presentations.Count (p => Path.Combine (presentationsHelper.PresentationsFolder, p.PresentationUID.ToString ()) == dir.ToString ()) == 0)
                    {
                        // Kann das Verzeichnis als Präsentation erkannt und importiert werden?
                        Guid presentationUID;

                        if (Guid.TryParse (dir.Name, out presentationUID))
                        {
                            // Ist es vielleicht eine "GoogleIO2012" Präsentation?
                            if (File.Exists (Path.Combine (dir.ToString (), "slide_config.js")))
                            {
                                // Scheint so
                                // Wird also als GoogleIO2012 importiert
                                GoogleIO2012Helper helper = new GoogleIO2012Helper (context);
                                GoogleIO2012Config config = helper.LoadConfig (presentationUID);

                                if (config.settings != null && !String.IsNullOrEmpty (config.settings.title))
                                {
                                    presentationsHelper.CreateNew (presentationUID, config.settings.title, Presentation.Typ.GoogleIO2012Slides);
                                    presentations.Add (new Presentation {
                                        PresentationUID = presentationUID,
                                        Name = config.settings.title,
                                        DateCreate = DateTime.Now,
                                        Type = Presentation.Typ.GoogleIO2012Slides
                                    });
                                } else
                                    dir.Delete (true);
                            }
                            else
                            {
                                // Ist doch ein unbekannter Typ
                                dir.Delete (true);
                            }
                        }
                        else
                        {
                            // Es ist wohl keine Präsentation
                            dir.Delete (true);
                        }
                    }
                }

                // Gelöschte Präsentationen aus der Datenbank entfernen
                foreach (Presentation pres in presentations)
                {
                    if (!Directory.Exists (Path.Combine (presentationsHelper.PresentationsFolder, pres.PresentationUID.ToString ())))
                        new DBPresentation ().Delete (pres.PresentationUID);
                }

                // Wenn es noch keine Präsentation gibt, die mitgelieferte als Demo / Vorlage kopieren
                if (dirInfo.GetDirectories ().Length == 0)
                {
                    Guid pUID = Guid.NewGuid ();
                    string pFolder = Path.Combine (presentationsHelper.PresentationsFolder, pUID.ToString ());

                    try
                    {
                        Directory.CreateDirectory (pFolder);

                        Dictionary<string, List<string>> dictTemplates = new Dictionary<string, List<string>> ();
                        dictTemplates.Add ("io-2012-slides", new List<string> {
                            "images/barchart.png",
                            "images/chart.png",
                            "images/chrome-logo-tiny.png",
                            "images/google_developers_icon_128.png",
                            "images/google_developers_logo.png",
                            "images/google_developers_logo_tiny.png",
                            "images/google_developers_logo_white.png",
                            "images/io2012_logo.png",
                            "images/sky.jpg",

                            "js/polyfills/classList.min.js",
                            "js/polyfills/dataset.min.js",
                            "js/polyfills/history.min.js",

                            "js/prettify/lang-apollo.js",
                            "js/prettify/lang-clj.js",
                            "js/prettify/lang-css.js",
                            "js/prettify/lang-go.js",
                            "js/prettify/lang-hs.js",
                            "js/prettify/lang-lisp.js",
                            "js/prettify/lang-lua.js",
                            "js/prettify/lang-ml.js",
                            "js/prettify/lang-n.js",
                            "js/prettify/lang-proto.js",
                            "js/prettify/lang-scala.js",
                            "js/prettify/lang-sql.js",
                            "js/prettify/lang-tex.js",
                            "js/prettify/lang-vb.js",
                            "js/prettify/lang-vhdl.js",
                            "js/prettify/lang-wiki.js",
                            "js/prettify/lang-xq.js",
                            "js/prettify/lang-yaml.js",
                            "js/prettify/prettify.css",
                            "js/prettify/prettify.js",

                            "js/hammer.js",
                            "js/modernizr.custom.45394.js",
                            "js/order.js",
                            "js/require-1.0.8.min.js",
                            "js/slide-controller.js",
                            "js/slide-deck.js",
                            "js/slides.js",

                            "scripts/md/base.html",
                            "scripts/md/README.md",
                            "scripts/md/render.py",
                            "scripts/md/slides.md",

                            "theme/css/default.css",
                            "theme/css/phone.css",

                            "theme/scss/_base.scss",
                            "theme/scss/default.scss",
                            "theme/scss/phone.scss",

                            "app.yaml",
                            "config.rb",
                            "README.html",
                            "README.md",
                            "serve.sh",
                            "slide_config.js",
                            "template.html"
                        });

                        string filename = null;
                        foreach (KeyValuePair<string, List<string>> kvpTemplate in dictTemplates)
                        {
                            foreach (string f in kvpTemplate.Value)
                            {
                                filename = Path.Combine (pFolder, f);

                                using (Stream stream = activity.Assets.Open("FP.Assets/" + kvpTemplate.Key + "/" + f))
                                {
                                    if (f.Contains ("/")) {
                                        int nIndex = filename.LastIndexOf ('/');
                                        string dirName = filename.Substring (0, nIndex);
                                        Directory.CreateDirectory (dirName);
                                    }

                                    Stream swOut = new FileStream (filename, FileMode.CreateNew);
                                    byte[] buffer = new byte[1024];
                                    int b = buffer.Length;
                                    int length;

                                    while ((length = stream.Read(buffer, 0, b)) > 0)
                                    {
                                        swOut.Write (buffer, 0, length);
                                    }

                                    swOut.Flush ();
                                    swOut.Close ();
                                    stream.Close ();
                                }
                            }

                            // Die Präsentation in der DB registrieren
                            string name = null;
                            Presentation.Typ typ;
                            switch (kvpTemplate.Key)
                            {
                            case "io-2012-slides":
                                typ = Presentation.Typ.GoogleIO2012Slides;
                                name = ((Android.App.Activity)context).GetText (De.Dhoffmann.Mono.FullscreenPresentation.Droid.Resource.String.PresentationTyp_GoogleIO2012Slides);
                                break;
                            default:
                                throw new NotImplementedException();
                            }

                            presentationsHelper.CreateNew (pUID, name, typ);
                        }
                    }
                    catch (Exception)
                    {
                        // Wenn etwas schief läuft den Ordner wieder aufräumen
                        if (Directory.Exists (presentationsHelper.PresentationsFolder))
                            Directory.Delete (presentationsHelper.PresentationsFolder, true);

                        return activity.GetText (De.Dhoffmann.Mono.FullscreenPresentation.Droid.Resource.String.DlgNewPresentationError);
                    }
                }

                return null;
            });
        }