commit 9c39179ef788b8526dbcf30623e355dc7818fc71
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Mon Jan 24 21:37:14 2022 +0100

    Downloading updates: dialog progress.

diff --git a/src/main/java/org/distorted/dialogs/RubikDialogUpdateView.java b/src/main/java/org/distorted/dialogs/RubikDialogUpdateView.java
new file mode 100644
index 00000000..a9b0a62c
--- /dev/null
+++ b/src/main/java/org/distorted/dialogs/RubikDialogUpdateView.java
@@ -0,0 +1,73 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2022 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Magic Cube.                                                              //
+//                                                                                               //
+// Magic Cube is free software: you can redistribute it and/or modify                            //
+// it under the terms of the GNU General Public License as published by                          //
+// the Free Software Foundation, either version 2 of the License, or                             //
+// (at your option) any later version.                                                           //
+//                                                                                               //
+// Magic Cube is distributed in the hope that it will be useful,                                 //
+// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
+// GNU General Public License for more details.                                                  //
+//                                                                                               //
+// You should have received a copy of the GNU General Public License                             //
+// along with Magic Cube.  If not, see <http://www.gnu.org/licenses/>.                           //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.dialogs;
+
+import android.app.Activity;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+import org.distorted.main.R;
+import org.distorted.network.RubikUpdates;
+import org.distorted.objectlib.json.JsonWriter;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+public class RubikDialogUpdateView
+  {
+  private View mView;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public RubikDialogUpdateView()
+    {
+
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public View createView(Activity act, RubikUpdates.UpdateInfo info, boolean isNew)
+    {
+    int layoutID = R.layout.dialog_updates_pane;
+    mView = act.getLayoutInflater().inflate(layoutID, null);
+    Button install = mView.findViewById(R.id.updates_pane_button);
+
+    install.setOnClickListener( new View.OnClickListener()
+      {
+      @Override
+      public void onClick(View v)
+        {
+        android.util.Log.e("D", "INSTALL pressed");
+        }
+      });
+
+    TextView title = mView.findViewById(R.id.updates_pane_title);
+    title.setText(info.mObjectLongName);
+    TextView version = mView.findViewById(R.id.updates_pane_version);
+    String strVersion = info.mUpdateObject
+                        ? JsonWriter.VERSION_OBJECT_MAJOR+"."+info.mObjectMinorVersion
+                        : JsonWriter.VERSION_EXTRAS_MAJOR+"."+info.mExtrasMinorVersion;
+    version.setText(strVersion);
+    TextView description = mView.findViewById(R.id.updates_pane_description);
+    description.setText(info.mDescription);
+
+    return mView;
+    }
+  }
diff --git a/src/main/java/org/distorted/dialogs/RubikDialogUpdates.java b/src/main/java/org/distorted/dialogs/RubikDialogUpdates.java
index a73cc6fc..5545dcba 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogUpdates.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogUpdates.java
@@ -20,6 +20,7 @@
 package org.distorted.dialogs;
 
 import android.app.Dialog;
+import android.content.Context;
 import android.content.DialogInterface;
 import android.os.Bundle;
 import android.util.DisplayMetrics;
@@ -27,7 +28,10 @@ import android.util.TypedValue;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.Window;
+import android.view.WindowManager;
 import android.widget.Button;
+import android.widget.LinearLayout;
+import android.widget.ScrollView;
 import android.widget.TextView;
 
 import androidx.annotation.NonNull;
@@ -44,13 +48,21 @@ import org.distorted.network.RubikUpdates;
 
 public class RubikDialogUpdates extends AppCompatDialogFragment implements RubikNetwork.Updatee
   {
-  private View createView(LayoutInflater inflater)
+  private TextView mText;
+  private ScrollView mScroll;
+  private LinearLayout mLayout;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private View createView(FragmentActivity act, LayoutInflater inflater, float size)
     {
     final View view = inflater.inflate(R.layout.dialog_updates, null);
 
-    TextView text = view.findViewById(R.id.about_version);
-    text.setTextSize(TypedValue.COMPLEX_UNIT_PX, 50);
-    text.setText("ggggg ruyujk j k");
+    mLayout= view.findViewById(R.id.updates_main_layout);
+    mScroll= view.findViewById(R.id.updates_scroll);
+    mText  = view.findViewById(R.id.updates_message);
+    mText.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
+    mText.setText( act.getString(R.string.downloading) );
 
     return view;
     }
@@ -70,10 +82,10 @@ public class RubikDialogUpdates extends AppCompatDialogFragment implements Rubik
     final float titleSize= displaymetrics.widthPixels * RubikActivity.MENU_BIG_TEXT_SIZE;
     final float okSize   = displaymetrics.widthPixels * RubikActivity.DIALOG_BUTTON_SIZE;
 
-    TextView tv = (TextView) inflater.inflate(R.layout.dialog_title, null);
-    tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, titleSize);
-    tv.setText(R.string.updates);
-    builder.setCustomTitle(tv);
+    TextView title = (TextView) inflater.inflate(R.layout.dialog_title, null);
+    title.setTextSize(TypedValue.COMPLEX_UNIT_PX, titleSize);
+    title.setText(R.string.updates);
+    builder.setCustomTitle(title);
 
     builder.setCancelable(true);
     builder.setPositiveButton( R.string.ok, new DialogInterface.OnClickListener()
@@ -85,7 +97,7 @@ public class RubikDialogUpdates extends AppCompatDialogFragment implements Rubik
         }
       });
 
-    View view = createView(inflater);
+    View view = createView(act,inflater,okSize);
     builder.setView(view);
 
     Dialog dialog = builder.create();
@@ -107,24 +119,85 @@ public class RubikDialogUpdates extends AppCompatDialogFragment implements Rubik
         }
       });
 
+    return dialog;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  @Override
+  public void onResume()
+    {
+    super.onResume();
+
     RubikNetwork network = RubikNetwork.getInstance();
     network.signUpForUpdates(this);
 
-    return dialog;
+    Window window = getDialog().getWindow();
+    Context context = getContext();
+
+    if( window!=null && context!=null )
+      {
+      DisplayMetrics metrics = context.getResources().getDisplayMetrics();
+      final float height= metrics.heightPixels;
+
+      WindowManager.LayoutParams params = window.getAttributes();
+      params.width = WindowManager.LayoutParams.WRAP_CONTENT;
+      params.height = (int)(0.75f*height);
+      window.setAttributes(params);
+
+      int textHeight = (int)(0.8f*params.height);
+      mText.setHeight(textHeight);
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public void receiveUpdate(RubikUpdates updates)
     {
+    FragmentActivity act = getActivity();
+    int numN = updates.getNewNumber();
+    int numU = updates.getUpdNumber();
+    int num = numN+numU;
 
+    if( num<=0 )
+      {
+      mScroll.setVerticalScrollBarEnabled(false);
+      mText.setText(act.getString(R.string.no_updates));
+      }
+    else
+      {
+      mText.setVisibility(View.GONE);
+
+      if( mLayout!=null )
+        {
+        for(int i=0; i<numN; i++)
+          {
+          RubikUpdates.UpdateInfo info = updates.getNewUpdate(i);
+          RubikDialogUpdateView rubikView = new RubikDialogUpdateView();
+          View pane = rubikView.createView(act,info,true);
+          mLayout.addView(pane);
+          }
+        for(int i=0; i<numU; i++)
+          {
+          RubikUpdates.UpdateInfo info = updates.getUpdUpdate(i);
+          RubikDialogUpdateView rubikView = new RubikDialogUpdateView();
+          View pane = rubikView.createView(act,info,false);
+          mLayout.addView(pane);
+          }
+        }
+      else
+        {
+        android.util.Log.e("D", "mainLayout NULL");
+        }
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public void errorUpdate()
     {
-    android.util.Log.e("D", "Dialog: Error receiving update");
+    mScroll.setVerticalScrollBarEnabled(false);
+    mText.setText("Network error");
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/main/RubikActivity.java b/src/main/java/org/distorted/main/RubikActivity.java
index 31ba0c6e..a0956eed 100644
--- a/src/main/java/org/distorted/main/RubikActivity.java
+++ b/src/main/java/org/distorted/main/RubikActivity.java
@@ -86,6 +86,7 @@ public class RubikActivity extends AppCompatActivity
     public static final float MENU_SMALL_TEXT_SIZE= 0.035f;
     public static final float TAB_WIDTH           = 0.100f;
     public static final float TAB_HEIGHT          = 0.100f;
+    public static final float BUBBLE_SIZE         = 0.15f;
 
     public static final int FLAGS =  View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
diff --git a/src/main/java/org/distorted/network/RubikUpdates.java b/src/main/java/org/distorted/network/RubikUpdates.java
index 624e2982..7e15622c 100644
--- a/src/main/java/org/distorted/network/RubikUpdates.java
+++ b/src/main/java/org/distorted/network/RubikUpdates.java
@@ -164,9 +164,30 @@ public class RubikUpdates
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public int getNumberOfUpdates()
+  public UpdateInfo getNewUpdate(int ordinal)
     {
-    return mNew.size()+mUpd.size();
+    return mNew.get(ordinal);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public UpdateInfo getUpdUpdate(int ordinal)
+    {
+    return mUpd.get(ordinal);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public int getNewNumber()
+    {
+    return mNew.size();
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public int getUpdNumber()
+    {
+    return mUpd.size();
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/screens/RubikScreenPlay.java b/src/main/java/org/distorted/screens/RubikScreenPlay.java
index 99e512d0..9db9d092 100644
--- a/src/main/java/org/distorted/screens/RubikScreenPlay.java
+++ b/src/main/java/org/distorted/screens/RubikScreenPlay.java
@@ -78,7 +78,6 @@ public class RubikScreenPlay extends RubikScreenBase implements RubikNetwork.Upd
   private PopupWindow mObjectPopup, mMenuPopup, mPlayPopup;
   private LinearLayout mPlayLayout;
   private TextView mBubbleUpdates;
-  private RubikUpdates mUpdates;
   private int mObjectSize, mMenuLayoutWidth, mMenuLayoutHeight, mPlayLayoutWidth;
   private int mLevelValue;
   private float mButtonSize, mMenuItemSize, mMenuTextSize;
@@ -86,6 +85,7 @@ public class RubikScreenPlay extends RubikScreenBase implements RubikNetwork.Upd
   private int mUpperBarHeight;
   private boolean mShouldReactToEndOfScrambling;
   private int mBottomHeight;
+  private float mScreenWidth;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -99,12 +99,12 @@ public class RubikScreenPlay extends RubikScreenBase implements RubikNetwork.Upd
   void enterScreen(final RubikActivity act)
     {
     int numObjects = RubikObjectList.getNumObjects();
-    float width = act.getScreenWidthInPixels();
+    mScreenWidth = act.getScreenWidthInPixels();
     mUpperBarHeight = act.getHeightUpperBar();
 
-    mMenuTextSize = width*RubikActivity.MENU_MED_TEXT_SIZE;
-    mButtonSize   = width*RubikActivity.BUTTON_TEXT_SIZE;
-    mMenuItemSize = width*RubikActivity.MENU_ITEM_SIZE;
+    mMenuTextSize = mScreenWidth*RubikActivity.MENU_MED_TEXT_SIZE;
+    mButtonSize   = mScreenWidth*RubikActivity.BUTTON_TEXT_SIZE;
+    mMenuItemSize = mScreenWidth*RubikActivity.MENU_ITEM_SIZE;
 
     mRowCount = (numObjects + NUM_COLUMNS-1) / NUM_COLUMNS;
     mColCount = NUM_COLUMNS;
@@ -113,13 +113,13 @@ public class RubikScreenPlay extends RubikScreenBase implements RubikNetwork.Upd
     LinearLayout layoutTop = act.findViewById(R.id.upperBar);
     layoutTop.removeAllViews();
 
-    setupObjectButton(act,width);
+    setupObjectButton(act,mScreenWidth);
     layoutTop.addView(mObjButton);
 
-    setupMenuButton(act,width);
+    setupMenuButton(act,mScreenWidth);
     layoutTop.addView(mMenuButton);
 
-    setupPlayButton(act,width);
+    setupPlayButton(act,mScreenWidth);
     layoutTop.addView(mPlayButton);
 
     setupSolveButton(act);
@@ -707,14 +707,17 @@ public class RubikScreenPlay extends RubikScreenBase implements RubikNetwork.Upd
     {
     updates.showDebug();
 
-    mUpdates = updates;
-    int num = mUpdates.getNumberOfUpdates();
+    int numN = updates.getNewNumber();
+    int numU = updates.getUpdNumber();
+    int num = numN+numU;
 
     if( num>0 )
       {
       String shownNum = String.valueOf(num);
       mBubbleUpdates.setText(shownNum);
       mBubbleUpdates.setVisibility(View.VISIBLE);
+      int height = (int)(0.05f*mScreenWidth);
+      mBubbleUpdates.setTextSize(TypedValue.COMPLEX_UNIT_PX,height);
       }
     else
       {
diff --git a/src/main/res/layout/dialog_updates.xml b/src/main/res/layout/dialog_updates.xml
index 99ae851b..d08a18bc 100644
--- a/src/main/res/layout/dialog_updates.xml
+++ b/src/main/res/layout/dialog_updates.xml
@@ -1,29 +1,25 @@
 <?xml version="1.0" encoding="utf-8"?>
 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/updates_scroll"
     android:layout_width="match_parent"
-    android:layout_height="match_parent">
+    android:layout_height="wrap_content"
+    android:paddingLeft="10dp"
+    android:paddingRight="10dp">
 
     <LinearLayout
         android:id="@+id/updates_main_layout"
-        android:layout_width="fill_parent"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:gravity="center|fill_horizontal"
-        android:layout_marginLeft="10dp"
-        android:layout_marginRight="10dp"
         android:layout_marginTop="0dp"
         android:background="@color/black"
         android:orientation="vertical">
 
-
         <TextView
-            android:id="@+id/about_version"
+            android:id="@+id/updates_message"
             android:layout_width="match_parent"
-            android:layout_height="fill_parent"
-            android:layout_weight="0.40"
-            android:layout_marginTop="10dp"
-            android:layout_marginLeft="10dp"
-            android:layout_marginRight="10dp"
-            android:layout_marginBottom="10dp"/>
+            android:layout_height="match_parent"
+            android:gravity="center"/>
 
     </LinearLayout>
 
diff --git a/src/main/res/layout/dialog_updates_pane.xml b/src/main/res/layout/dialog_updates_pane.xml
new file mode 100644
index 00000000..79ec7802
--- /dev/null
+++ b/src/main/res/layout/dialog_updates_pane.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+	xmlns:android="http://schemas.android.com/apk/res/android"
+	android:layout_width="match_parent"
+	android:layout_height="wrap_content"
+	android:orientation="horizontal"
+	android:paddingTop="4dp"
+	android:paddingBottom="4dp">
+
+   	<ImageView
+   		android:id="@+id/updates_pane_image"
+   		android:layout_width="wrap_content"
+   		android:layout_height="wrap_content"
+   		android:layout_margin="8dp"/>
+
+   	<LinearLayout
+   		android:layout_width="0dp"
+ 		android:layout_height="wrap_content"
+ 		android:layout_weight="1"
+ 		android:orientation="vertical"
+ 		android:layout_gravity="center_vertical">
+
+		<TextView
+    		android:id="@+id/updates_pane_title"
+    		android:layout_width="match_parent"
+    		android:layout_height="wrap_content"
+    		android:textStyle="bold"/>
+   		<TextView
+    		android:id="@+id/updates_pane_version"
+    		android:layout_width="wrap_content"
+    		android:layout_height="wrap_content"/>
+    	<TextView
+    		android:id="@+id/updates_pane_description"
+    		android:layout_width="wrap_content"
+    		android:layout_height="wrap_content"/>
+    	<Button
+             android:id="@+id/updates_pane_button"
+             android:layout_width="wrap_content"
+             android:layout_height="wrap_content"
+             android:singleLine="true"
+             android:gravity="end"/>
+ 	</LinearLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/src/main/res/layout/popup_object.xml b/src/main/res/layout/popup_object.xml
index 383631a2..82b618b7 100644
--- a/src/main/res/layout/popup_object.xml
+++ b/src/main/res/layout/popup_object.xml
@@ -21,8 +21,8 @@
    <RelativeLayout
        android:id="@+id/bottomLayout"
        android:layout_width="match_parent"
-       android:background="@color/grey"
        android:layout_height="wrap_content"
+       android:background="@color/grey"
        android:paddingEnd="10dp"
        android:paddingStart="10dp">
 
diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml
index 01531031..256d355a 100755
--- a/src/main/res/values-de/strings.xml
+++ b/src/main/res/values-de/strings.xml
@@ -40,6 +40,7 @@
     <string name="tutorials">Lernprogrammen</string>
     <string name="about">Über die App</string>
     <string name="updates">Aktualisierungen</string>
+    <string name="no_updates">Nicht gefunden</string>
     <string name="abandon_solve">Gib auf</string>
 
     <string name="config_details">Einzelheiten</string>
diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml
index e4e5c62b..0c283a56 100755
--- a/src/main/res/values-es/strings.xml
+++ b/src/main/res/values-es/strings.xml
@@ -40,6 +40,7 @@
     <string name="tutorials">Tutoriales</string>
     <string name="about">Acerca de</string>
     <string name="updates">Actualizaciones</string>
+    <string name="no_updates">Extraviado</string>
     <string name="abandon_solve">Abandonar</string>
 
     <string name="config_details">Detalles</string>
diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml
index a76b58ae..30729226 100755
--- a/src/main/res/values-fr/strings.xml
+++ b/src/main/res/values-fr/strings.xml
@@ -40,6 +40,7 @@
     <string name="tutorials">Tutoriels</string>
     <string name="about">À propos de</string>
     <string name="updates">Mises à jour</string>
+    <string name="no_updates">Pas trouvé</string>
     <string name="abandon_solve">Abandonner</string>
 
     <string name="config_details">Détails</string>
diff --git a/src/main/res/values-ja/strings.xml b/src/main/res/values-ja/strings.xml
index 9225addc..7891c4f7 100755
--- a/src/main/res/values-ja/strings.xml
+++ b/src/main/res/values-ja/strings.xml
@@ -40,6 +40,7 @@
     <string name="tutorials">チュートリアル</string>
     <string name="about">アプリについて</string>
     <string name="updates">更新</string>
+    <string name="no_updates">見つかりません</string>
     <string name="abandon_solve">あきらめる</string>
 
     <string name="config_details">詳細</string>
diff --git a/src/main/res/values-ko/strings.xml b/src/main/res/values-ko/strings.xml
index 340e1b04..3b26ecf7 100755
--- a/src/main/res/values-ko/strings.xml
+++ b/src/main/res/values-ko/strings.xml
@@ -40,6 +40,7 @@
     <string name="tutorials">튜토리얼</string>
     <string name="about">정보</string>
     <string name="updates">업데이트</string>
+    <string name="no_updates">업데이트가 없습니다</string>
     <string name="abandon_solve">포기</string>
 
     <string name="config_details">세부</string>
diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml
index 5f9a2955..07513eab 100644
--- a/src/main/res/values-pl/strings.xml
+++ b/src/main/res/values-pl/strings.xml
@@ -40,6 +40,7 @@
     <string name="tutorials">Tutoriale</string>
     <string name="about">O aplikacji</string>
     <string name="updates">Aktualizacje</string>
+    <string name="no_updates">Nie znaleziono</string>
     <string name="abandon_solve">Zrezygnuj</string>
 
     <string name="config_details">O kostce</string>
diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml
index afe0bdf5..da651886 100755
--- a/src/main/res/values-ru/strings.xml
+++ b/src/main/res/values-ru/strings.xml
@@ -40,6 +40,7 @@
     <string name="tutorials">Учебники</string>
     <string name="about">О нас</string>
     <string name="updates">Обновления</string>
+    <string name="no_updates">Не найдено</string>
     <string name="abandon_solve">Сдаться</string>
 
     <string name="config_details">Детали</string>
diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml
index 7e424d11..79003302 100644
--- a/src/main/res/values-zh-rCN/strings.xml
+++ b/src/main/res/values-zh-rCN/strings.xml
@@ -40,6 +40,7 @@
     <string name="tutorials">讲解</string>
     <string name="about">关于</string>
     <string name="updates">更新</string>
+    <string name="no_updates">未找到更新</string>
     <string name="abandon_solve">放弃</string>
 
     <string name="config_details">细节</string>
diff --git a/src/main/res/values-zh-rTW/strings.xml b/src/main/res/values-zh-rTW/strings.xml
index bb8e6dd4..d6b44965 100644
--- a/src/main/res/values-zh-rTW/strings.xml
+++ b/src/main/res/values-zh-rTW/strings.xml
@@ -40,6 +40,7 @@
     <string name="tutorials">講解</string>
     <string name="about">關於</string>
     <string name="updates">更新</string>
+    <string name="no_updates">未找到更新</string>
     <string name="abandon_solve">放棄</string>
 
     <string name="config_details">細節</string>
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index b612569d..980af5b1 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -41,6 +41,7 @@
     <string name="tutorials">Tutorials</string>
     <string name="about">About</string>
     <string name="updates">Updates</string>
+    <string name="no_updates">No update found</string>
 
     <string name="credits1">Open Source app developed using the Distorted graphics library. Licensed under <a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html">GPL version 2</a> or - at your option - any later version.</string>
     <string name="credits2">Pretty Patterns by Walter Randelshofer. See <a href="http://www.randelshofer.ch">http://www.randelshofer.ch</a></string>
