Merge branch 'master' into improvement/16/manage-repos
Conflicts: res/layout/appdetails.xml res/values/strings.xml src/org/fdroid/fdroid/DB.java src/org/fdroid/fdroid/FDroid.java src/org/fdroid/fdroid/ManageRepo.java
This commit is contained in:
commit
ffa2c962dc
8
.gitignore
vendored
8
.gitignore
vendored
@ -1,12 +1,12 @@
|
||||
local.properties
|
||||
build.properties
|
||||
/local.properties
|
||||
/build.properties
|
||||
.classpath
|
||||
/bin/
|
||||
/gen/
|
||||
/build
|
||||
/.gradle
|
||||
proguard.cfg
|
||||
build.xml
|
||||
/proguard.cfg
|
||||
/build.xml
|
||||
*~
|
||||
.idea
|
||||
*.iml
|
||||
|
@ -2,11 +2,11 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="org.fdroid.fdroid"
|
||||
android:installLocation="auto"
|
||||
android:versionCode="550"
|
||||
android:versionCode="560"
|
||||
android:versionName="@string/version_name" >
|
||||
|
||||
<uses-sdk
|
||||
android:minSdkVersion="4"
|
||||
android:minSdkVersion="5"
|
||||
android:targetSdkVersion="19" />
|
||||
|
||||
<supports-screens
|
||||
@ -107,11 +107,8 @@
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
|
||||
<!-- Android's scheme matcher is case-sensitive, so include most likely variations -->
|
||||
<data android:scheme="fdroidrepo" />
|
||||
<data android:scheme="FDROIDREPO" />
|
||||
<data android:scheme="fdroidrepos" />
|
||||
<data android:scheme="FDROIDREPOS" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
|
@ -3,7 +3,7 @@ buildscript {
|
||||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:0.6.+'
|
||||
classpath 'com.android.tools.build:gradle:0.7.+'
|
||||
}
|
||||
}
|
||||
|
||||
@ -15,7 +15,7 @@ dependencies {
|
||||
|
||||
android {
|
||||
compileSdkVersion 19
|
||||
buildToolsVersion "19.0.0"
|
||||
buildToolsVersion "19.0.1"
|
||||
|
||||
sourceSets {
|
||||
main {
|
||||
|
2
extern/Universal-Image-Loader
vendored
2
extern/Universal-Image-Loader
vendored
@ -1 +1 @@
|
||||
Subproject commit 2a8a184d40b16756fd80edc342550bb2335d6461
|
||||
Subproject commit 75ea560049c9a256ca4fba0a70de1971aa852612
|
Binary file not shown.
Before Width: | Height: | Size: 970 B |
@ -14,8 +14,8 @@
|
||||
android:id="@+id/landleft"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="5dp"
|
||||
android:paddingRight="6dp"
|
||||
android:padding="5dp"
|
||||
android:layout_marginRight="4dp"
|
||||
android:orientation="vertical" >
|
||||
|
||||
<RelativeLayout
|
||||
@ -37,10 +37,10 @@
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/icon"
|
||||
android:layout_width="42dp"
|
||||
android:layout_height="42dp"
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="48dp"
|
||||
android:layout_below="@id/title"
|
||||
android:layout_marginRight="5dp"
|
||||
android:layout_marginRight="6dp"
|
||||
android:scaleType="fitCenter" />
|
||||
|
||||
<TextView
|
||||
@ -49,7 +49,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/title"
|
||||
android:layout_toRightOf="@id/icon"
|
||||
android:textSize="12sp" />
|
||||
android:textSize="13sp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/status"
|
||||
@ -57,7 +57,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/license"
|
||||
android:layout_toRightOf="@id/icon"
|
||||
android:textSize="12sp" />
|
||||
android:textSize="13sp" />
|
||||
</RelativeLayout>
|
||||
</LinearLayout>
|
||||
</ScrollView>
|
||||
|
@ -1,57 +1,71 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:paddingTop="5dp"
|
||||
android:paddingLeft="8dp"
|
||||
android:paddingRight="8dp"
|
||||
android:orientation="vertical" >
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:padding="5dp"
|
||||
android:baselineAligned="false"
|
||||
android:orientation="vertical" >
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/header"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingBottom="4dp"
|
||||
android:orientation="horizontal" >
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/icon"
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="48dp"
|
||||
android:cropToPadding="true"
|
||||
android:layout_marginLeft="2dp"
|
||||
android:layout_marginRight="6dp"
|
||||
android:layout_width="56dp"
|
||||
android:layout_height="56dp"
|
||||
android:padding="4dp"
|
||||
android:scaleType="fitCenter" />
|
||||
|
||||
<RelativeLayout
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="6dp"
|
||||
android:layout_height="fill_parent"
|
||||
android:padding="6dp"
|
||||
android:layout_centerVertical="true"
|
||||
android:orientation="vertical" >
|
||||
|
||||
<TextView
|
||||
android:id="@+id/title"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="marquee"
|
||||
android:singleLine="true"
|
||||
android:textSize="18sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/status"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_below="@id/title"
|
||||
android:textSize="12sp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/license"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_alignParentRight="true"
|
||||
android:padding="3dp"
|
||||
android:textSize="12sp" />
|
||||
android:paddingTop="2sp"
|
||||
android:paddingBottom="2sp"
|
||||
android:layout_marginLeft="8dp"
|
||||
android:textSize="13sp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/categories"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_marginLeft="8dp"
|
||||
android:textSize="13sp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/title"
|
||||
android:textSize="18sp"
|
||||
android:textStyle="bold"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="end"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_toLeftOf="@id/license" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/status"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="13sp"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_toLeftOf="@id/categories" />
|
||||
|
||||
</RelativeLayout>
|
||||
</LinearLayout>
|
||||
|
@ -2,10 +2,7 @@
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="3dp"
|
||||
android:paddingLeft="3dp"
|
||||
android:paddingRight="3dp"
|
||||
android:paddingBottom="11dp"
|
||||
android:paddingBottom="10dp"
|
||||
android:baselineAligned="false"
|
||||
android:orientation="vertical" >
|
||||
|
||||
@ -13,14 +10,13 @@
|
||||
android:id="@+id/summary"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="14sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/appid"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="12sp" />
|
||||
android:textSize="13sp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/signature"
|
||||
@ -33,7 +29,6 @@
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="6sp"
|
||||
android:textSize="14sp"
|
||||
android:textStyle="bold"
|
||||
android:textColor="#ff0000" />
|
||||
|
||||
@ -50,7 +45,6 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="8sp"
|
||||
android:singleLine="true"
|
||||
android:textSize="14sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
<TextView
|
||||
|
@ -1,80 +1,72 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:baselineAligned="false" >
|
||||
|
||||
<!-- Actual icon size is dependent on preferences and set in
|
||||
AppListAdapater.java:layoutIcon() -->
|
||||
<ImageView android:id="@+id/icon"
|
||||
android:scaleType="fitCenter"
|
||||
android:layout_width="64dp"
|
||||
android:layout_height="64dp"
|
||||
android:padding="8dp"
|
||||
android:layout_centerVertical="true" />
|
||||
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="3dp"
|
||||
android:paddingBottom="5dp"
|
||||
android:layout_height="fill_parent"
|
||||
android:paddingLeft="3dp"
|
||||
android:paddingRight="3dp"
|
||||
android:paddingRight="8dp"
|
||||
android:layout_toRightOf="@id/icon"
|
||||
android:layout_centerVertical="true"
|
||||
android:baselineAligned="false" >
|
||||
|
||||
<ImageView android:id="@+id/icon"
|
||||
android:scaleType="fitCenter"
|
||||
android:layout_width="40dp"
|
||||
android:layout_height="40dp"
|
||||
android:layout_marginTop="4dp"
|
||||
android:layout_marginBottom="4dp"
|
||||
android:layout_marginRight="6dp"
|
||||
android:layout_marginLeft="2dp"
|
||||
/>
|
||||
<TextView android:id="@+id/status"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="end"
|
||||
android:paddingTop="2sp"
|
||||
android:paddingBottom="2sp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="8dp"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_alignParentRight="true" />
|
||||
|
||||
<LinearLayout android:id="@+id/status_icons"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_alignParentRight="true"
|
||||
android:padding="4dp">
|
||||
<TextView android:id="@+id/license"
|
||||
android:singleLine="true"
|
||||
android:textSize="13sp"
|
||||
android:ellipsize="end"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="8dp"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_alignParentRight="true" />
|
||||
|
||||
<ImageView android:id="@+id/icon_status_has_updates"
|
||||
android:layout_width="18dp"
|
||||
android:layout_height="18dp"
|
||||
android:visibility="gone"
|
||||
android:gravity="end" />
|
||||
<TextView android:id="@+id/name"
|
||||
android:textSize="17sp"
|
||||
android:textStyle="bold"
|
||||
android:paddingBottom="3sp"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="end"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_toLeftOf="@id/status" />
|
||||
|
||||
<ImageView android:id="@+id/icon_status_installed"
|
||||
android:layout_width="18dp"
|
||||
android:layout_height="18dp"
|
||||
android:visibility="gone"
|
||||
android:gravity="end" />
|
||||
<TextView android:id="@+id/summary"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="end"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/name"
|
||||
android:gravity="center_vertical"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_toLeftOf="@id/license" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<TextView android:id="@+id/name"
|
||||
android:textSize="18sp"
|
||||
android:textStyle="bold"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="marquee"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_toRightOf="@id/icon"
|
||||
android:paddingTop="4dp" />
|
||||
|
||||
<TextView android:id="@+id/status"
|
||||
android:textSize="12sp"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="end"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_toRightOf="@id/icon"
|
||||
android:layout_below="@id/name" />
|
||||
|
||||
<TextView android:id="@+id/license"
|
||||
android:textSize="12sp"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="end"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="8dp"
|
||||
android:layout_alignParentRight="true" />
|
||||
|
||||
<TextView android:id="@+id/summary"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="end"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/icon"
|
||||
android:paddingLeft="@dimen/applist_summary_padding" />
|
||||
</RelativeLayout>
|
||||
|
||||
</RelativeLayout>
|
||||
|
@ -3,8 +3,6 @@
|
||||
android:id="@+id/fdroid_layout"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:paddingLeft="2dp"
|
||||
android:paddingRight="2dp"
|
||||
android:baselineAligned="false"
|
||||
android:orientation="vertical">
|
||||
|
||||
|
@ -9,7 +9,6 @@
|
||||
|
||||
<TextView android:id="@+id/description"
|
||||
android:singleLine="false"
|
||||
android:textSize="14sp"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="4dp"
|
||||
|
@ -17,10 +17,10 @@
|
||||
<string name="never">niemals</string>
|
||||
<string name="automatic_repo_scan">Automatische Paketaktualisierung</string>
|
||||
<string name="update_apps_list">Anwendungsliste automatisch aus den Paketquellen aktualisieren</string>
|
||||
<string name="automatic_scan_wifi">Nur bei WLAN</string>
|
||||
<string name="automatic_scan_wifi_desc">Anwendungsliste nur bei WLAN automatisch aktualisieren</string>
|
||||
<string name="automatic_scan_wifi">Nur über WLAN</string>
|
||||
<string name="automatic_scan_wifi_desc">Anwendungsliste nur über WLAN automatisch aktualisieren</string>
|
||||
<string name="notify">Benachrichtigen</string>
|
||||
<string name="notify_updates_available">Bei verfügbaren Aktualisierungen benachrichtigen</string>
|
||||
<string name="notify_updates_available">Benachrichtigen, wenn neue Aktualisierungen verfügbar sind</string>
|
||||
<string name="update_history">Aktualisierungsverlauf</string>
|
||||
<string name="update_history_desc">Zeitraum in Tagen, für den neue bzw. aktualisierte Anwendungen angezeigt werden.</string>
|
||||
<string name="search_results">Suchergebnisse</string>
|
||||
@ -93,8 +93,8 @@ Sollen diese aktualisiert werden?</string>
|
||||
<string name="expert">Experte</string>
|
||||
<string name="expert_mode">Expertenmodus einschalten</string>
|
||||
<string name="search_hint">Anwendungen suchen</string>
|
||||
<string name="db_sync_mode">Art der Datenbanksynchronisation</string>
|
||||
<string name="db_sync_mode_long">SQLite Synchronisationsmodus setzen</string>
|
||||
<string name="db_sync_mode">Datenbanksynchronisierungsart</string>
|
||||
<string name="db_sync_mode_long">SQLite-Synchronisationsmodus einstellen</string>
|
||||
<string name="appcompatibility">Kompatibilität der Anwendung</string>
|
||||
<string name="show_incompat_versions">Inkompatible Versionen</string>
|
||||
<string name="show_incompat_versions_l">Anwendungsversionen anzeigen, welche mit dem Gerät inkompatibel sind</string>
|
||||
|
@ -1,34 +1,34 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="searchres_napps">Atopáronse %1$d aplicacións que cadran con \'%2$s\':</string>
|
||||
<string name="searchres_oneapp">Atopouse unha aplicación que cadra con \'%s\':</string>
|
||||
<string name="searchres_noapps">Non se atoparon aplicacións que cadren con \'%s\'</string>
|
||||
<string name="SignatureMismatch">A nova versión está asinada cunha chave diferente da antiga. Para instalar a nova versión, antes débese desinstalar a anterior. Por favor, fai esto e téntao de novo. (Decátate que ó desinstalar borrarase calquera dato interno gardado pola aplicación)</string>
|
||||
<string name="searchres_napps">Atopáronse %1$d aplicativos que cadran con \'%2$s\':</string>
|
||||
<string name="searchres_oneapp">Atopouse un aplicativo que cadra con \'%s\':</string>
|
||||
<string name="searchres_noapps">Non se atoparon aplicativos que cadren con \'%s\'</string>
|
||||
<string name="SignatureMismatch">A nova versión está asinada cunha clave diferente da antiga. Para instalar a nova versión, antes débese desinstalar a anterior. Por favor, fágao e téntao de novo. (Ao desinstalar borrarase calquera dato interno gardado pola aplicación)</string>
|
||||
<string name="installIncompatible">Parece que este paquete non é compatíbel co seu dispositivo. Quere facer a proba e instalalo aínda así?</string>
|
||||
<string name="installDowngrade">Estás tentando de instalar unha versión anterior. Esto pode acarrexar un mal funcionamento ou pérdida de datos. ¿Queres tentalo aínda así?</string>
|
||||
<string name="installDowngrade">Está tentando instalar unha versión anterior. Isto pode supoñer un mal funcionamento ou perda de datos. Quere tentalo de todas maneiras?</string>
|
||||
<string name="version">Versión</string>
|
||||
<string name="n_versions_available">%d versións dispoñíbles</string>
|
||||
<string name="n_version_available">%d versión dispoñíbles</string>
|
||||
<string name="cache_downloaded">Caché de aplicacións descargadas</string>
|
||||
<string name="n_versions_available">%d versións dispoñíbeis</string>
|
||||
<string name="n_version_available">%d versión dispoñíbeis</string>
|
||||
<string name="cache_downloaded">Memorizar as aps descargadas</string>
|
||||
<string name="keep_downloaded">Gardar os ficheiros apk descargados na tarxeta SD</string>
|
||||
<string name="updates">Actualizacións</string>
|
||||
<string name="other">Outro</string>
|
||||
<string name="last_update_check">Último escaneado do repositorio: %s</string>
|
||||
<string name="never">nunca</string>
|
||||
<string name="automatic_repo_scan">Escaneado automático dos repositorios</string>
|
||||
<string name="update_apps_list">Actualizar automáticamente a lista de aplicacións do repositorio</string>
|
||||
<string name="update_apps_list">Actualizar automaticamente a lista de aps do repositorio</string>
|
||||
<string name="automatic_scan_wifi">Soamente no wifi</string>
|
||||
<string name="automatic_scan_wifi_desc">Actualizar as listas de aps automaticamente soamente cando hai wifi</string>
|
||||
<string name="notify">Notificar</string>
|
||||
<string name="notify_updates_available">Avisarme cando estean dispoñíbles novas actualizacións</string>
|
||||
<string name="notify_updates_available">Avisarme cando estean dispoñíbeis novas actualizacións</string>
|
||||
<string name="update_history">Histórico de actualizacións</string>
|
||||
<string name="update_history_desc">Días para mostrar aplicacións novas/actualizadas</string>
|
||||
<string name="update_history_desc">Días para amosar aps novas/actualizadas</string>
|
||||
<string name="search_results">Resultados da busca</string>
|
||||
<string name="app_details">Detalles da ap</string>
|
||||
<string name="no_such_app">Non se atopa tal ap</string>
|
||||
<string name="about_title">Sobre F-Droid</string>
|
||||
<string name="about_desc">Baseado en Aptoide.
|
||||
Publicado con licencia GNU GPLv3.</string>
|
||||
Publicado con licenza GNU GPLv3.</string>
|
||||
<string name="about_site">Sitio web:</string>
|
||||
<string name="about_mail">Correo:</string>
|
||||
<string name="about_version">Versión:</string>
|
||||
@ -43,8 +43,8 @@ Un enderezo a un repositorio sería algo
|
||||
como
|
||||
isto: https://f-droid.org/repo</string>
|
||||
<string name="inst">Instalada</string>
|
||||
<string name="not_inst">Non instalado</string>
|
||||
<string name="added_on">Engadido en %s</string>
|
||||
<string name="not_inst">Non instalada</string>
|
||||
<string name="added_on">Engadida a %s</string>
|
||||
<string name="ok">Aceptar</string>
|
||||
<string name="yes">Si</string>
|
||||
<string name="no">Non</string>
|
||||
@ -54,17 +54,17 @@ Un enderezo a un repositorio sería algo
|
||||
<string name="repo_delete_title">Escoller o repositorio que retirar</string>
|
||||
<string name="repo_update_title">Actualizar repositorios</string>
|
||||
<string name="tab_installed">Instalado</string>
|
||||
<string name="tab_noninstalled">Dispoñíble</string>
|
||||
<string name="tab_noninstalled">Dispoñíbel</string>
|
||||
<string name="tab_updates">Actualizacións</string>
|
||||
<string name="one_update_available">1 Actualización dispoñíble</string>
|
||||
<string name="many_updates_available">%d actualizacións dispoñíbles</string>
|
||||
<string name="fdroid_updates_available">Actualizacións de F-Droid dispoñíbles</string>
|
||||
<string name="one_update_available">1 Actualización dispoñíbel</string>
|
||||
<string name="many_updates_available">%d actualizacións dispoñíbeis</string>
|
||||
<string name="fdroid_updates_available">Actualizacións de F-Droid dispoñíbeis</string>
|
||||
<string name="process_wait_title">Agarde por favor</string>
|
||||
<string name="process_update_msg">Actualizando a lista de aplicacións...</string>
|
||||
<string name="download_server">Obtendo a aplicación desde</string>
|
||||
<string name="process_update_msg">Actualizando a lista de aplicativos...</string>
|
||||
<string name="download_server">Obtención do aplicativo desde</string>
|
||||
<string name="repo_add_url">Enderezo do repositorio</string>
|
||||
<string name="repo_alrt">Cambiou a lista de repositorios usados.
|
||||
¿Queres actualizalos?</string>
|
||||
Quere actualizalos?</string>
|
||||
<string name="menu_update_repo">Actualizar repositorios</string>
|
||||
<string name="menu_manage">Xestionar repositorios</string>
|
||||
<string name="menu_preferences">Preferencias</string>
|
||||
@ -85,7 +85,7 @@ Un enderezo a un repositorio sería algo
|
||||
<string name="menu_donate">Doar</string>
|
||||
<string name="details_installed">Instalada a versión %s</string>
|
||||
<string name="details_notinstalled">Non instalada</string>
|
||||
<string name="corrupt_download">O ficheiro descargado está corrompido</string>
|
||||
<string name="corrupt_download">O ficheiro descargado está corrupto</string>
|
||||
<string name="download_cancelled">Descarga cancelada</string>
|
||||
<string name="antiadslist">Esta ap contén publicidade</string>
|
||||
<string name="antitracklist">Esta ap rexistra e informa da súa actividade</string>
|
||||
@ -95,35 +95,35 @@ Un enderezo a un repositorio sería algo
|
||||
<string name="display">Amosar</string>
|
||||
<string name="expert">Experto</string>
|
||||
<string name="expert_mode">Activar o modo experto</string>
|
||||
<string name="search_hint">Buscar aplicacións</string>
|
||||
<string name="search_hint">Buscar aplicativos</string>
|
||||
<string name="db_sync_mode">Modo de sincronización da base de datos</string>
|
||||
<string name="db_sync_mode_long">Estabelece o valor da bandeira de sincronización de SQLite</string>
|
||||
<string name="appcompatibility">Compatibilidade de aplicacións</string>
|
||||
<string name="db_sync_mode_long">Estabelece o valor da marca de sincronización de SQLite</string>
|
||||
<string name="appcompatibility">Compatibilidade de aplicativos</string>
|
||||
<string name="show_incompat_versions">Versións incompatíbeis</string>
|
||||
<string name="show_incompat_versions_l">Amosar versións de aps que son incompatíbeis co dispositivo</string>
|
||||
<string name="rooted">Root</string>
|
||||
<string name="rooted_long">Amosar aplicacións que requiren privilexios de root</string>
|
||||
<string name="rooted_long">Amosar aplicativos que requiren privilexios de root</string>
|
||||
<string name="ignoreTouch">Ignorar a pantalla táctil</string>
|
||||
<string name="ignoreTouch_long">Incluír sempre as aplicacións que requiren pantalla táctil</string>
|
||||
<string name="ignoreTouch_long">Incluír sempre as aps que requiren pantalla táctil</string>
|
||||
<string name="category_all">Todos</string>
|
||||
<string name="category_whatsnew">Qué novidades hai</string>
|
||||
<string name="category_recentlyupdated">Actualizado recentemente</string>
|
||||
<string name="status_download">Descargando
|
||||
%2$s / %3$s (%4$d%%) desde
|
||||
%1$s</string>
|
||||
<string name="status_processing_xml">Procesando a aplicación
|
||||
<string name="status_processing_xml">Procesando o aplicativo
|
||||
%2$d de %3$d desde
|
||||
%1$s</string>
|
||||
<string name="status_connecting_to_repo">Conectándose con
|
||||
%1$s</string>
|
||||
<string name="status_checking_compatibility">Comprobando a compatibilidade das aplicacións con teu aparato</string>
|
||||
<string name="status_checking_compatibility">Comprobando a compatibilidade das aps con seu aparello</string>
|
||||
<string name="no_permissions">Non se usan permisos</string>
|
||||
<string name="permissions_for_long">Permisos para a versión %s</string>
|
||||
<string name="showPermissions">Amosar permisos</string>
|
||||
<string name="showPermissions_long">Amosar unha lista dos permisos que precisa unha aplicación</string>
|
||||
<string name="showPermissions_long">Presentar a lista dos permisos que precisa unha ap</string>
|
||||
<string name="no_handler_app">Non ten ningunha ap dispoñíbel que poida manexar %s</string>
|
||||
<string name="compactlayout">Deseño compacto</string>
|
||||
<string name="compactlayout_long">Amosar únicamente os nomes das aplicacións e resumos na lista</string>
|
||||
<string name="compactlayout_long">Amosar unicamente os nomes das aps e resumos na lista</string>
|
||||
<string name="theme">Tema</string>
|
||||
<string name="theme_long">Escolla un tema</string>
|
||||
</resources>
|
||||
|
19
res/values-ko/array.xml
Normal file
19
res/values-ko/array.xml
Normal file
@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string-array name="updateIntervalNames">
|
||||
<item>끔</item>
|
||||
<item>매시간마다</item>
|
||||
<item>4시간마다</item>
|
||||
<item>12시간마다</item>
|
||||
<item>매일</item>
|
||||
</string-array>
|
||||
<string-array name="themeNames">
|
||||
<item>어두운</item>
|
||||
<item>밝은</item>
|
||||
</string-array>
|
||||
<string-array name="dbSyncModeNames">
|
||||
<item>해제 (안전하지 않음)</item>
|
||||
<item>보통</item>
|
||||
<item>전체</item>
|
||||
</string-array>
|
||||
</resources>
|
107
res/values-ko/strings.xml
Normal file
107
res/values-ko/strings.xml
Normal file
@ -0,0 +1,107 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="searchres_napps">\'%2$s\' 검색결과 (%1$d개)</string>
|
||||
<string name="searchres_oneapp">\'%s\' 검색결과:</string>
|
||||
<string name="searchres_noapps">\'%s\' 와 일치하는 응용프로그램을 찾을 수 없습니다.</string>
|
||||
<string name="installDowngrade">이 응용 프로그램의 다운그레이드 하려고 합니다. 이전 버전을 설치할 경우, 응용 프로그램에 데이터가 손상되거나 오작동이 발생할 수 있습니다. 정말로 다운그레이드하시겠습니까?</string>
|
||||
<string name="version">버전</string>
|
||||
<string name="n_versions_available">%d개의 버전을 사용할 수 있습니다.</string>
|
||||
<string name="n_version_available">%d개의 버전을 사용할 수 있습니다.</string>
|
||||
<string name="cache_downloaded">다운로드된 설치파일 저장</string>
|
||||
<string name="keep_downloaded">SD카드에 다운로드된 설치파일을 보관</string>
|
||||
<string name="updates">업데이트</string>
|
||||
<string name="other">기타</string>
|
||||
<string name="last_update_check">마지막 저장소 검색: %s</string>
|
||||
<string name="automatic_repo_scan">자동으로 저장소 검색</string>
|
||||
<string name="update_apps_list">자동으로 저장소의 앱 목록을 갱신합니다.</string>
|
||||
<string name="automatic_scan_wifi">Wi-Fi 연결 시에만</string>
|
||||
<string name="automatic_scan_wifi_desc">Wi-Fi에 연결되어 있을 때만 자동으로 앱 목록을 갱신합니다.</string>
|
||||
<string name="notify">알림</string>
|
||||
<string name="notify_updates_available">새로운 업데이트가 가능할 때 알림</string>
|
||||
<string name="update_history">이력 업데이트</string>
|
||||
<string name="search_results">검색 결과</string>
|
||||
<string name="app_details">앱 상세정보</string>
|
||||
<string name="about_title">F-Droid 대하여</string>
|
||||
<string name="about_site">웹사이트:</string>
|
||||
<string name="about_mail">이메일:</string>
|
||||
<string name="about_version">버전:</string>
|
||||
<string name="about_website">웹사이트</string>
|
||||
<string name="no_repo">저장소가 구성되지 않았습니다!
|
||||
저장소는 응용프로그램의 소스입니다.
|
||||
추가하려면, 메뉴에 \"새 저장소\" 버튼을 누르고 URL 입력해주세요.
|
||||
저장소 URL 예: https://f-droid.org/repo</string>
|
||||
<string name="inst">설치됨</string>
|
||||
<string name="not_inst">설치되지 않음</string>
|
||||
<string name="added_on">%s에 추가됨</string>
|
||||
<string name="ok">확인</string>
|
||||
<string name="yes">예</string>
|
||||
<string name="no">아니오</string>
|
||||
<string name="repo_add_title">새로운 저장소 추가</string>
|
||||
<string name="repo_add_add">추가</string>
|
||||
<string name="cancel">취소</string>
|
||||
<string name="repo_delete_title">제거할 저장소 선택</string>
|
||||
<string name="repo_update_title">저장소 업데이트</string>
|
||||
<string name="tab_installed">설치됨</string>
|
||||
<string name="tab_updates">업데이트</string>
|
||||
<string name="one_update_available">1개의 업데이트를 사용할 수 있습니다.</string>
|
||||
<string name="many_updates_available">%d개의 업데이트를 사용할 수 있습니다.</string>
|
||||
<string name="fdroid_updates_available">F-Droid 업데이트를 사용할 수 있습니다.</string>
|
||||
<string name="process_wait_title">잠시만 기다려주세요</string>
|
||||
<string name="process_update_msg">응용 프로그램 목록 업데이트중...</string>
|
||||
<string name="download_server">에서 응용프로그램 가져오기</string>
|
||||
<string name="repo_add_url">저장소 주소</string>
|
||||
<string name="repo_alrt">사용된 저장소의 목록이 변경되었습니다.
|
||||
업데이트 하시겠습니까?</string>
|
||||
<string name="menu_update_repo">저장소 업데이트</string>
|
||||
<string name="menu_manage">저장소 관리</string>
|
||||
<string name="menu_preferences">설정</string>
|
||||
<string name="menu_about">대하여</string>
|
||||
<string name="menu_search">검색</string>
|
||||
<string name="menu_add_repo">새로운 저장소</string>
|
||||
<string name="menu_rem_repo">저장소 제거</string>
|
||||
<string name="menu_launch">실행</string>
|
||||
<string name="menu_share">공유</string>
|
||||
<string name="menu_install">설치</string>
|
||||
<string name="menu_uninstall">제거</string>
|
||||
<string name="menu_ignore_all">모든 업데이트 무시</string>
|
||||
<string name="menu_ignore_this">이 업데이트 무시</string>
|
||||
<string name="menu_website">웹사이트</string>
|
||||
<string name="menu_issues">이슈</string>
|
||||
<string name="menu_source">소스코드</string>
|
||||
<string name="menu_upgrade">업그레이드</string>
|
||||
<string name="menu_donate">기부</string>
|
||||
<string name="details_notinstalled">설치되지 않음</string>
|
||||
<string name="corrupt_download">다운로드된 파일이 손상되었습니다.</string>
|
||||
<string name="download_cancelled">다운로드 취소됨</string>
|
||||
<string name="antiadslist">이 응용프로그램은 광고가 포함되어 있습니다.</string>
|
||||
<string name="antitracklist">이 응용프로그램은 활동을 추적하여 리포트를 보고합니다.</string>
|
||||
<string name="display">표시</string>
|
||||
<string name="expert">전문가</string>
|
||||
<string name="expert_mode">전문가 모드 사용</string>
|
||||
<string name="search_hint">응용 프로그램 검색</string>
|
||||
<string name="db_sync_mode">데이터베이스 동기화 모드</string>
|
||||
<string name="appcompatibility">응용 프로그램 호환성</string>
|
||||
<string name="show_incompat_versions">호환되지 않는 버전</string>
|
||||
<string name="rooted_long">Root 권한이 필요한 앱을 보여줍니다.</string>
|
||||
<string name="ignoreTouch">터치스크린 무시</string>
|
||||
<string name="ignoreTouch_long">터치스크린을 요구하는 앱을 포함합니다</string>
|
||||
<string name="category_all">전체</string>
|
||||
<string name="category_whatsnew">새로운 기능</string>
|
||||
<string name="category_recentlyupdated">최근 업데이트</string>
|
||||
<string name="status_download">%1$s 에서 다운로드 중입니다.
|
||||
%2$s / %3$s (%4$d%%)</string>
|
||||
<string name="status_processing_xml">응용 프로그램 처리중
|
||||
%1$s
|
||||
%2$d / %3$d</string>
|
||||
<string name="status_connecting_to_repo">%1$s에 접속중</string>
|
||||
<string name="status_checking_compatibility">장치와 응용프로그램의 호환성 확인중…</string>
|
||||
<string name="no_permissions">사용된 권한이 없습니다.</string>
|
||||
<string name="permissions_for_long">%s 버전에 대한 권한</string>
|
||||
<string name="showPermissions">권한 표시</string>
|
||||
<string name="showPermissions_long">응용 프로그램이 필요한 권한의 목록을 표시</string>
|
||||
<string name="no_handler_app">%s을(를) 처리할 수 있는 응용프로그램이 없습니다.</string>
|
||||
<string name="compactlayout">컴팩트 레이아웃</string>
|
||||
<string name="compactlayout_long">목록에 웹이름과 요약정보만 표시합니다.</string>
|
||||
<string name="theme">테마</string>
|
||||
<string name="theme_long">사용할 테마를 선택하세요.</string>
|
||||
</resources>
|
@ -3,7 +3,7 @@
|
||||
<string name="searchres_napps">%1$d applicaties gevonden die voldoen aan \'%2$s\':</string>
|
||||
<string name="searchres_oneapp">Één applicatie gevonden die voldoet aan \'%s\':</string>
|
||||
<string name="searchres_noapps">Geen applicaties gevonden die voldoen aan \'%s\'</string>
|
||||
<string name="SignatureMismatch">De nieuwe versie is gesigned met een andere sleutel als de oude. Om de nieuwe versie te installeren moet eerst de oude verwijderd worden. Probeer het daarna nogmaals. (Let op dat het verwijderen de data van de applicatie verwijderd wordt)</string>
|
||||
<string name="SignatureMismatch">De nieuwe versie is gesigneerd met een andere sleutel als de oude. Om de nieuwe versie te installeren moet eerst de oude verwijderd worden. Probeer het daarna nogmaals. (Let op dat bij het verwijderen de data van de applicatie ook verwijderd wordt)</string>
|
||||
<string name="installIncompatible">Dit pakket is niet verenigbaar met uw apparaat. Wilt u het alsnog proberen te installeren?</string>
|
||||
<string name="installDowngrade">U probeert deze applicatie te degraderen naar een oudere versie. Als u dit doet uw data kan corrupt of verloren raken. Wilt u dit alsnog uitvoeren?</string>
|
||||
<string name="version">Versie</string>
|
||||
@ -15,12 +15,12 @@
|
||||
<string name="other">Andere</string>
|
||||
<string name="last_update_check">Laatste bronnen scan: %s</string>
|
||||
<string name="never">nooit</string>
|
||||
<string name="automatic_repo_scan">Automatische bronnen-scan</string>
|
||||
<string name="automatic_repo_scan">Scan bronnen automatisch</string>
|
||||
<string name="update_apps_list">app-lijst automatisch bijwerken</string>
|
||||
<string name="automatic_scan_wifi">Allen op wifi</string>
|
||||
<string name="automatic_scan_wifi_desc">Vernieuw app-lijst alleen op wifi automatisch</string>
|
||||
<string name="notify">Verwittigen</string>
|
||||
<string name="notify_updates_available">Verwittigen bij nieuwe beschikbare updates</string>
|
||||
<string name="notify_updates_available">Verwittigen wanneer nieuwe updates beschikbaar zijn</string>
|
||||
<string name="update_history">Vernieuw historie</string>
|
||||
<string name="update_history_desc">Dagen om nieuwe/verbeterde apps te laten zien</string>
|
||||
<string name="search_results">Zoekresultaten</string>
|
||||
@ -59,11 +59,11 @@ Een bron-adres ziet er ongeveer
|
||||
<string name="many_updates_available">%d vernieuwingen zijn beschikbaar</string>
|
||||
<string name="fdroid_updates_available">F-Droid Vernieuwingen Beschikbaar</string>
|
||||
<string name="process_wait_title">Even geduld aub</string>
|
||||
<string name="process_update_msg">Applicatie-lijst vernieuwen</string>
|
||||
<string name="process_update_msg">Applicatie-lijst vernieuwen...</string>
|
||||
<string name="download_server">downloaden applicatie van</string>
|
||||
<string name="repo_add_url">Bron-adres</string>
|
||||
<string name="repo_alrt">De lijst van gebruikte bronnen is veranderd.
|
||||
Wil je ze vernieuwen?</string>
|
||||
Wilt u ze vernieuwen?</string>
|
||||
<string name="menu_update_repo">Vernieuw Bronnen</string>
|
||||
<string name="menu_manage">Beheer bronnen</string>
|
||||
<string name="menu_preferences">Voorkeuren</string>
|
||||
@ -82,8 +82,8 @@ Wil je ze vernieuwen?</string>
|
||||
<string name="menu_source">Broncode</string>
|
||||
<string name="menu_upgrade">Verbeteren</string>
|
||||
<string name="menu_donate">Doneer</string>
|
||||
<string name="details_installed">Versie %s geinstalleerd</string>
|
||||
<string name="details_notinstalled">Niet geinstalleerd</string>
|
||||
<string name="details_installed">Versie %s geïnstalleerd</string>
|
||||
<string name="details_notinstalled">Niet geïnstalleerd</string>
|
||||
<string name="corrupt_download">Gedownloade bestand is corrupt</string>
|
||||
<string name="download_cancelled">Download geannuleerd</string>
|
||||
<string name="antiadslist">Deze app bevat advertenties</string>
|
||||
@ -94,9 +94,9 @@ Wil je ze vernieuwen?</string>
|
||||
<string name="display">Laat zien</string>
|
||||
<string name="expert">Expert</string>
|
||||
<string name="expert_mode">Ga in expert-modus</string>
|
||||
<string name="search_hint">Zoek-applicaties</string>
|
||||
<string name="search_hint">Zoek applicaties</string>
|
||||
<string name="db_sync_mode">Database sync-modus</string>
|
||||
<string name="db_sync_mode_long">Zet de SQLite\'s synchronisatie-vlag</string>
|
||||
<string name="db_sync_mode_long">Zet de waarde van SQLite\'s synchronisatie-vlag</string>
|
||||
<string name="appcompatibility">Applicatie verenigbaarheid</string>
|
||||
<string name="show_incompat_versions">Onverenigbare versies</string>
|
||||
<string name="show_incompat_versions_l">Laat versies van apps die onverenigbaar zijn met het apparaat</string>
|
||||
|
@ -10,12 +10,18 @@
|
||||
<string name="cache_downloaded">Buforuj pobrane aplikacje</string>
|
||||
<string name="keep_downloaded">Przechowuj pobrane pliki apk na karcie SD</string>
|
||||
<string name="updates">Aktualizacje</string>
|
||||
<string name="other">Inne</string>
|
||||
<string name="last_update_check">Ostatnie uaktualnienie listy aplikacji: %s</string>
|
||||
<string name="never">nigdy</string>
|
||||
<string name="automatic_repo_scan">Automatycznie skanuj repozytoria</string>
|
||||
<string name="update_apps_list">Automatycznie uaktualnij listę aplikacji z repozytorium</string>
|
||||
<string name="automatic_scan_wifi">Tylko przez wifi</string>
|
||||
<string name="automatic_scan_wifi_desc">Aktualizuj automatycznie tylko przez wifi</string>
|
||||
<string name="notify">Powiadom</string>
|
||||
<string name="notify_updates_available">Powiadamiaj, gdy dostępne będą nowe aktualizacje</string>
|
||||
<string name="update_history">Historia aktualizacji</string>
|
||||
<string name="search_results">Wyniki wyszukiwania</string>
|
||||
<string name="no_such_app">Nie znaleziono takiej aplikacji</string>
|
||||
<string name="about_title">O F-Droid</string>
|
||||
<string name="about_site">Strona internetowa:</string>
|
||||
<string name="about_mail">Email:</string>
|
||||
@ -23,6 +29,7 @@
|
||||
<string name="about_website">Strona internetowa</string>
|
||||
<string name="inst">Zainstalowano</string>
|
||||
<string name="not_inst">Niezainstalowane</string>
|
||||
<string name="added_on">Dodano %s</string>
|
||||
<string name="ok">OK</string>
|
||||
<string name="yes">Tak</string>
|
||||
<string name="no">Nie</string>
|
||||
@ -48,8 +55,11 @@ Czy chcesz je zaktualizować?</string>
|
||||
<string name="menu_add_repo">Nowe repozytorium</string>
|
||||
<string name="menu_rem_repo">Usuń repozytorium</string>
|
||||
<string name="menu_launch">Uruchom</string>
|
||||
<string name="menu_install">Instaluj</string>
|
||||
<string name="menu_share">Udostępnij</string>
|
||||
<string name="menu_install">Zainstaluj</string>
|
||||
<string name="menu_uninstall">Odinstaluj</string>
|
||||
<string name="menu_ignore_all">Ignoruj wszystkie aktualizacje</string>
|
||||
<string name="menu_ignore_this">Ignoruj tę aktualizację</string>
|
||||
<string name="menu_website">Strona internetowa</string>
|
||||
<string name="menu_issues">Problemy</string>
|
||||
<string name="menu_source">Kod żródłowy</string>
|
||||
@ -67,6 +77,9 @@ Czy chcesz je zaktualizować?</string>
|
||||
<string name="rooted">Root</string>
|
||||
<string name="rooted_long">Pokaż aplikacje wymagające uprawnień root</string>
|
||||
<string name="category_all">Wszystkie</string>
|
||||
<string name="category_whatsnew">Ostatnio dodane</string>
|
||||
<string name="category_whatsnew">Co nowego</string>
|
||||
<string name="category_recentlyupdated">Ostatnio zaktualizowane</string>
|
||||
<string name="status_connecting_to_repo">Trwa łączenie z
|
||||
%1$s</string>
|
||||
<string name="showPermissions">Wyświetl uprawnienia</string>
|
||||
</resources>
|
||||
|
@ -4,7 +4,7 @@
|
||||
<string name="searchres_oneapp">Ett program matchade \'%s\':</string>
|
||||
<string name="searchres_noapps">Inga program matchade \'%s\'</string>
|
||||
<string name="SignatureMismatch">Den nya versionen är signerad med en annan nyckel än den gamla. Den gamla versionen måste först avinstalleras. Försök sedan igen. (Observera att data som tillhör programmet kommer att raderas när det avinstalleras.)</string>
|
||||
<string name="installIncompatible">Det verkar som om detta programmet inte är kompatibelt med enheten. Vill ni försöka installera det ändå?</string>
|
||||
<string name="installIncompatible">Det verkar som att detta program inte är kompatibelt med enheten. Vill ni försöka installera det ändå?</string>
|
||||
<string name="installDowngrade">Du försöker nedgradera detta program. Detta kan få det att fungera felaktigt eller orsaka förlust av dina data. Vill du ändå försöka nedgradera?</string>
|
||||
<string name="version">Version</string>
|
||||
<string name="n_versions_available">%d versioner tillgängliga</string>
|
||||
@ -18,7 +18,7 @@
|
||||
<string name="automatic_repo_scan">Automatisk förrådsavsökning</string>
|
||||
<string name="update_apps_list">Uppdatera applistan från förråd automatiskt</string>
|
||||
<string name="automatic_scan_wifi">Endast via WiFi</string>
|
||||
<string name="automatic_scan_wifi_desc">Uppdatera applikasjonslista automatiskt endast över wifi</string>
|
||||
<string name="automatic_scan_wifi_desc">Uppdatera applistor automatiskt endast över wifi</string>
|
||||
<string name="notify">Avisering</string>
|
||||
<string name="notify_updates_available">Meddela mig när nya uppdateringar finns</string>
|
||||
<string name="update_history">Uppdateringshistorik</string>
|
||||
@ -58,7 +58,7 @@ En förrådsadress ser ut så här: https://f-droid.org/repo</string>
|
||||
<string name="process_wait_title">Var vänlig vänta</string>
|
||||
<string name="process_update_msg">Uppdaterar programlistan...</string>
|
||||
<string name="download_server">Hämtar program från</string>
|
||||
<string name="repo_add_url">Förrådadress</string>
|
||||
<string name="repo_add_url">Förrådsadress</string>
|
||||
<string name="repo_alrt">Listan över förråd har ändrats.
|
||||
Vill du uppdatera dem?</string>
|
||||
<string name="menu_update_repo">Uppdatera förråd</string>
|
||||
@ -72,8 +72,8 @@ Vill du uppdatera dem?</string>
|
||||
<string name="menu_share">Dela</string>
|
||||
<string name="menu_install">Installera</string>
|
||||
<string name="menu_uninstall">Avinstallera</string>
|
||||
<string name="menu_ignore_all">Ignorer alla uppdateringar</string>
|
||||
<string name="menu_ignore_this">Ignorer denna uppdateringen</string>
|
||||
<string name="menu_ignore_all">Ignorera alla uppdateringar</string>
|
||||
<string name="menu_ignore_this">Ignorera denna uppdatering</string>
|
||||
<string name="menu_website">Webbplats</string>
|
||||
<string name="menu_issues">Buggar</string>
|
||||
<string name="menu_source">Källkod</string>
|
||||
@ -85,9 +85,9 @@ Vill du uppdatera dem?</string>
|
||||
<string name="download_cancelled">Nerladdning avbruten</string>
|
||||
<string name="antiadslist">Denna app innehåller reklam</string>
|
||||
<string name="antitracklist">Denna app övervakar dina aktiviteter</string>
|
||||
<string name="antinonfreeadlist">Denna app promoterar ufria tillägg</string>
|
||||
<string name="antinonfreenetlist">Denna app promoterar ufria nätverkstjänster</string>
|
||||
<string name="antinonfreedeplist">Denna app avhenger av andra ufria apps</string>
|
||||
<string name="antinonfreeadlist">Denna app främjar ofria tillägg</string>
|
||||
<string name="antinonfreenetlist">Denna app främjar ofria nätverkstjänster</string>
|
||||
<string name="antinonfreedeplist">Denna app beror på andra ofria appar</string>
|
||||
<string name="display">Visning</string>
|
||||
<string name="expert">Expert</string>
|
||||
<string name="expert_mode">Aktivera expertläge</string>
|
||||
@ -96,7 +96,7 @@ Vill du uppdatera dem?</string>
|
||||
<string name="db_sync_mode_long">Ställ in värdet på synchronous-flaggan i SQLite</string>
|
||||
<string name="appcompatibility">Programkompatibilitet</string>
|
||||
<string name="show_incompat_versions">Inkompatibla versioner</string>
|
||||
<string name="show_incompat_versions_l">Visa versioner av apps som är ukompatibla med ditt apparat</string>
|
||||
<string name="show_incompat_versions_l">Visa versioner av appar som är inkompatibla med enheten</string>
|
||||
<string name="rooted">Root</string>
|
||||
<string name="rooted_long">Visa appar som kräver root-rättigheter</string>
|
||||
<string name="ignoreTouch">Ignorera touchscreen</string>
|
||||
@ -116,8 +116,8 @@ Vill du uppdatera dem?</string>
|
||||
<string name="no_permissions">Inga behörigheter används.</string>
|
||||
<string name="permissions_for_long">Behörigheter för version %s</string>
|
||||
<string name="showPermissions">Visa behörigheter</string>
|
||||
<string name="showPermissions_long">Visa en lista av behörigheter en app behöver</string>
|
||||
<string name="no_handler_app">Ni har inte något app tilgängligt för behandling av %s</string>
|
||||
<string name="showPermissions_long">Visa en lista över behörigheter en app behöver</string>
|
||||
<string name="no_handler_app">Du har inte någon app tillgänglig för hantering av %s</string>
|
||||
<string name="compactlayout">Kompakt layout</string>
|
||||
<string name="compactlayout_long">Visa endast appnamn och sammanfattningar i listan</string>
|
||||
<string name="theme">Tema</string>
|
||||
|
@ -1,4 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<dimen name="applist_summary_padding">3dp</dimen>
|
||||
<!--48dp with 8dp padding, 48+16=64-->
|
||||
<dimen name="applist_icon_normal_size">64dp</dimen>
|
||||
<!--32dp with 8dp padding, 32+16=48-->
|
||||
<dimen name="applist_icon_compact_size">48dp</dimen>
|
||||
</resources>
|
||||
|
@ -2,13 +2,14 @@
|
||||
<resources>
|
||||
|
||||
<string name="app_name">F-Droid</string>
|
||||
<string name="version_name">0.55</string>
|
||||
<string name="version_name">0.56-test</string>
|
||||
|
||||
<string name="about_sitec">https://f-droid.org</string>
|
||||
<string name="about_mailc">team@f-droid.org</string>
|
||||
|
||||
<string name="menu_bitcoin">Bitcoin</string>
|
||||
<string name="menu_litecoin">Litecoin</string>
|
||||
<string name="menu_dogecoin">Dogecoin</string>
|
||||
<string name="menu_flattr">Flattr</string>
|
||||
|
||||
<string-array name="updateIntervalValues">
|
||||
|
@ -7,25 +7,26 @@
|
||||
<string name="installIncompatible">It seems like this package is not compatible with your device. Do you want to try and install it anyway?</string>
|
||||
<string name="installDowngrade">You are trying to downgrade this application. Doing so might get it to malfunction and even lose your data. Do you want to try and downgrade it anyway?</string>
|
||||
<string name="version">Version</string>
|
||||
<string name="n_versions_available">%d versions available</string>
|
||||
<string name="n_version_available">%d version available</string>
|
||||
<string name="edit">Edit</string>
|
||||
<string name="delete">Delete</string>
|
||||
<string name="cache_downloaded">Cache downloaded apps</string>
|
||||
<string name="keep_downloaded">Keep downloaded apk files on SD card</string>
|
||||
<string name="cache_downloaded">App cache</string>
|
||||
<string name="cache_downloaded_on">Keep downloaded apk files on SD card</string>
|
||||
<string name="cache_downloaded_off">Do not keep any apk files</string>
|
||||
<string name="updates">Updates</string>
|
||||
<string name="other">Other</string>
|
||||
<string name="last_update_check">Last repo scan: %s</string>
|
||||
<string name="never">never</string>
|
||||
|
||||
<string name="automatic_repo_scan">Automatic repo scan</string>
|
||||
<string name="update_apps_list">Update app list from repositories automatically</string>
|
||||
<string name="update_interval">Automatic update interval</string>
|
||||
<string name="update_interval_zero">No automatic app list updates</string>
|
||||
<string name="automatic_scan_wifi">Only on wifi</string>
|
||||
<string name="automatic_scan_wifi_desc">Update app lists automatically only on wifi</string>
|
||||
<string name="automatic_scan_wifi_on">Update app lists automatically only on wifi</string>
|
||||
<string name="automatic_scan_wifi_off">Always update app lists automatically</string>
|
||||
<string name="notify">Notify</string>
|
||||
<string name="notify_updates_available">Notify when new updates are available</string>
|
||||
<string name="notify_on">Notify when updates are available</string>
|
||||
<string name="notify_off">Do not notify of any updates</string>
|
||||
<string name="update_history">Update history</string>
|
||||
<string name="update_history_desc">Days to show new/updated apps</string>
|
||||
<string name="update_history_summ">Days to consider apps new or recent: %s</string>
|
||||
|
||||
<string name="search_results">Search Results</string>
|
||||
<string name="app_details">App Details</string>
|
||||
@ -64,7 +65,6 @@
|
||||
<string name="repo_delete_title">Choose repository to remove</string>
|
||||
|
||||
<string name="repo_update_title">Update repositories</string>
|
||||
<string name="tab_installed">Installed</string>
|
||||
<string name="tab_noninstalled">Available</string>
|
||||
<string name="tab_updates">Updates</string>
|
||||
<string name="one_update_available">1 update is available.</string>
|
||||
@ -121,20 +121,23 @@
|
||||
<string name="display">Display</string>
|
||||
|
||||
<string name="expert">Expert</string>
|
||||
<string name="expert_mode">Enable expert mode</string>
|
||||
<string name="expert_on">Show extra info and enable extra settings</string>
|
||||
<string name="expert_off">Hide extras for experienced users</string>
|
||||
|
||||
<string name="search_hint">Search applications</string>
|
||||
|
||||
<string name="db_sync_mode">Database sync mode</string>
|
||||
<string name="db_sync_mode_long">Set the value of SQLite\'s "synchronous" flag</string>
|
||||
|
||||
<string name="appcompatibility">Application compatibility</string>
|
||||
<string name="show_incompat_versions">Incompatible versions</string>
|
||||
<string name="show_incompat_versions_l">Show versions of apps that are incompatible with the device</string>
|
||||
<string name="show_incompat_versions_on">Show app versions incompatible with the device</string>
|
||||
<string name="show_incompat_versions_off">Hide app versions incompatible with the device</string>
|
||||
<string name="rooted">Root</string>
|
||||
<string name="rooted_long">Show apps that require root privileges</string>
|
||||
<string name="rooted_on">Do not grey out apps requiring root privileges</string>
|
||||
<string name="rooted_off">Grey out apps requiring root privileges</string>
|
||||
<string name="ignoreTouch">Ignore Touchscreen</string>
|
||||
<string name="ignoreTouch_long">Always include apps that require touchscreen</string>
|
||||
<string name="ignoreTouch_on">Always include apps that require touchscreen</string>
|
||||
<string name="ignoreTouch_off">Filter apps normally</string>
|
||||
|
||||
<string name="category_all">All</string>
|
||||
<string name="category_whatsnew">What\'s New</string>
|
||||
@ -154,12 +157,13 @@
|
||||
<string name="no_permissions">No permissions are used.</string>
|
||||
<string name="permissions_for_long">Permissions for version %s</string>
|
||||
<string name="showPermissions">Show permissions</string>
|
||||
<string name="showPermissions_long">Display a list of permissions an app needs</string>
|
||||
<string name="showPermissions_on">Display a list of permissions an app requires</string>
|
||||
<string name="showPermissions_off">Don\'t show permissions before downloading</string>
|
||||
<string name="no_handler_app">You don\'t have any available app that can handle %s</string>
|
||||
<string name="compactlayout">Compact Layout</string>
|
||||
<string name="compactlayout_long">Only show app names and summaries in list</string>
|
||||
<string name="compactlayout_on">Show icons at a smaller size</string>
|
||||
<string name="compactlayout_off">Show icons at regular size</string>
|
||||
<string name="theme">Theme</string>
|
||||
<string name="theme_long">Choose a theme to use</string>
|
||||
<string name="unsigned">Unsigned</string>
|
||||
<string name="repo_url">URL</string>
|
||||
<string name="repo_num_apps"># of apps</string>
|
||||
|
@ -1,57 +1,56 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<PreferenceCategory android:title="@string/updates">
|
||||
<ListPreference android:title="@string/automatic_repo_scan"
|
||||
android:summary="@string/update_apps_list" android:key="updateInterval"
|
||||
<ListPreference android:title="@string/update_interval"
|
||||
android:key="updateInterval"
|
||||
android:defaultValue="24" android:entries="@array/updateIntervalNames"
|
||||
android:entryValues="@array/updateIntervalValues" />
|
||||
<CheckBoxPreference android:title="@string/automatic_scan_wifi"
|
||||
android:defaultValue="false" android:summary="@string/automatic_scan_wifi_desc"
|
||||
android:defaultValue="false"
|
||||
android:key="updateOnWifiOnly" />
|
||||
<CheckBoxPreference android:title="@string/notify"
|
||||
android:defaultValue="true" android:summary="@string/notify_updates_available"
|
||||
android:defaultValue="true"
|
||||
android:key="updateNotify" />
|
||||
<EditTextPreference
|
||||
android:defaultValue="14"
|
||||
android:key="updateHistoryDays"
|
||||
android:maxLength="2"
|
||||
android:numeric="integer"
|
||||
android:summary="@string/update_history_desc"
|
||||
android:title="@string/update_history" />
|
||||
</PreferenceCategory>
|
||||
<PreferenceCategory android:title="@string/display">
|
||||
<CheckBoxPreference android:title="@string/showPermissions"
|
||||
android:defaultValue="false" android:summary="@string/showPermissions_long"
|
||||
android:defaultValue="false"
|
||||
android:key="showPermissions"/>
|
||||
<CheckBoxPreference android:title="@string/compactlayout"
|
||||
android:defaultValue="false" android:summary="@string/compactlayout_long"
|
||||
android:defaultValue="false"
|
||||
android:key="compactlayout"/>
|
||||
<ListPreference android:title="@string/theme"
|
||||
android:summary="@string/theme_long" android:key="theme"
|
||||
android:key="theme"
|
||||
android:defaultValue="dark"
|
||||
android:entries="@array/themeNames"
|
||||
android:entryValues="@array/themeValues" />
|
||||
</PreferenceCategory>
|
||||
<PreferenceCategory android:title="@string/appcompatibility">
|
||||
<CheckBoxPreference android:title="@string/show_incompat_versions"
|
||||
android:defaultValue="false" android:summary="@string/show_incompat_versions_l"
|
||||
android:defaultValue="false"
|
||||
android:key="incompatibleVersions" />
|
||||
<CheckBoxPreference android:title="@string/rooted"
|
||||
android:defaultValue="true" android:summary="@string/rooted_long"
|
||||
android:defaultValue="true"
|
||||
android:key="rooted" />
|
||||
<CheckBoxPreference android:title="@string/ignoreTouch"
|
||||
android:defaultValue="false" android:summary="@string/ignoreTouch_long"
|
||||
android:defaultValue="false"
|
||||
android:key="ignoreTouchscreen" />
|
||||
</PreferenceCategory>
|
||||
<PreferenceCategory android:title="@string/other">
|
||||
<CheckBoxPreference android:title="@string/cache_downloaded"
|
||||
android:defaultValue="false" android:summary="@string/keep_downloaded"
|
||||
android:defaultValue="false"
|
||||
android:key="cacheDownloaded" />
|
||||
<CheckBoxPreference android:title="@string/expert"
|
||||
android:defaultValue="false" android:summary="@string/expert_mode"
|
||||
android:key="expert" />
|
||||
<ListPreference android:title="@string/db_sync_mode"
|
||||
android:summary="@string/db_sync_mode_long" android:key="dbSyncMode"
|
||||
android:key="dbSyncMode"
|
||||
android:dependency="expert"
|
||||
android:defaultValue="full" android:entries="@array/dbSyncModeNames"
|
||||
android:entryValues="@array/dbSyncModeValues" />
|
||||
|
@ -62,6 +62,7 @@ import android.view.SubMenu;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.BaseAdapter;
|
||||
import android.graphics.Bitmap;
|
||||
|
||||
import android.support.v4.app.NavUtils;
|
||||
import android.support.v4.view.MenuItemCompat;
|
||||
@ -71,7 +72,10 @@ import org.fdroid.fdroid.compat.ActionBarCompat;
|
||||
import org.fdroid.fdroid.compat.MenuManager;
|
||||
import org.fdroid.fdroid.DB.CommaSeparatedList;
|
||||
|
||||
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
|
||||
import com.nostra13.universalimageloader.core.DisplayImageOptions;
|
||||
import com.nostra13.universalimageloader.core.ImageLoader;
|
||||
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
|
||||
|
||||
public class AppDetails extends ListActivity {
|
||||
|
||||
@ -83,11 +87,18 @@ public class AppDetails extends ListActivity {
|
||||
private List<DB.Apk> items;
|
||||
|
||||
public ApkListAdapter(Context context, List<DB.Apk> items) {
|
||||
this.items = (items != null ? items : new ArrayList<DB.Apk>());
|
||||
this.items = new ArrayList<DB.Apk>();
|
||||
if (items != null) {
|
||||
for (DB.Apk apk : items) {
|
||||
this.addItem(apk);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void addItem(DB.Apk apk) {
|
||||
items.add(apk);
|
||||
if (apk.compatible || pref_incompatibleVersions) {
|
||||
items.add(apk);
|
||||
}
|
||||
}
|
||||
|
||||
public List<DB.Apk> getItems() {
|
||||
@ -124,7 +135,7 @@ public class AppDetails extends ListActivity {
|
||||
|
||||
TextView tv = (TextView) v.findViewById(R.id.version);
|
||||
tv.setText(getString(R.string.version) + " " + apk.version
|
||||
+ (apk == app.curApk ? " *" : ""));
|
||||
+ (apk == app.curApk ? " ☆" : ""));
|
||||
tv.setEnabled(apk.compatible);
|
||||
|
||||
tv = (TextView) v.findViewById(R.id.status);
|
||||
@ -182,8 +193,9 @@ public class AppDetails extends ListActivity {
|
||||
private static final int DONATE = Menu.FIRST + 9;
|
||||
private static final int BITCOIN = Menu.FIRST + 10;
|
||||
private static final int LITECOIN = Menu.FIRST + 11;
|
||||
private static final int FLATTR = Menu.FIRST + 12;
|
||||
private static final int DONATE_URL = Menu.FIRST + 13;
|
||||
private static final int DOGECOIN = Menu.FIRST + 12;
|
||||
private static final int FLATTR = Menu.FIRST + 13;
|
||||
private static final int DONATE_URL = Menu.FIRST + 14;
|
||||
|
||||
private DB.App app;
|
||||
private String appid;
|
||||
@ -197,7 +209,8 @@ public class AppDetails extends ListActivity {
|
||||
LinearLayout headerView;
|
||||
View infoView;
|
||||
|
||||
private Context mctx = this;
|
||||
private final Context mctx = this;
|
||||
private DisplayImageOptions displayImageOptions;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
@ -205,6 +218,16 @@ public class AppDetails extends ListActivity {
|
||||
((FDroidApp) getApplication()).applyTheme(this);
|
||||
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
displayImageOptions = new DisplayImageOptions.Builder()
|
||||
.cacheInMemory(true)
|
||||
.cacheOnDisc(true)
|
||||
.imageScaleType(ImageScaleType.NONE)
|
||||
.showImageOnLoading(R.drawable.ic_repo_app_default)
|
||||
.showImageForEmptyUri(R.drawable.ic_repo_app_default)
|
||||
.bitmapConfig(Bitmap.Config.RGB_565)
|
||||
.build();
|
||||
|
||||
ActionBarCompat abCompat = ActionBarCompat.create(this);
|
||||
abCompat.setDisplayHomeAsUpEnabled(true);
|
||||
|
||||
@ -214,13 +237,13 @@ public class AppDetails extends ListActivity {
|
||||
Uri data = i.getData();
|
||||
if (data != null) {
|
||||
if (data.isHierarchical()) {
|
||||
if (data.getHost().equals("details")) {
|
||||
if (data.getHost() != null && data.getHost().equals("details")) {
|
||||
// market://details?id=app.id
|
||||
appid = data.getQueryParameter("id");
|
||||
} else {
|
||||
// https://f-droid.org/app/app.id
|
||||
appid = data.getLastPathSegment();
|
||||
if (appid.equals("app")) appid = null;
|
||||
if (appid != null && appid.equals("app")) appid = null;
|
||||
}
|
||||
} else {
|
||||
// fdroid.app:app.id
|
||||
@ -234,6 +257,10 @@ public class AppDetails extends ListActivity {
|
||||
appid = i.getStringExtra("appid");
|
||||
}
|
||||
|
||||
if (i.hasExtra("from")) {
|
||||
setTitle(i.getStringExtra("from"));
|
||||
}
|
||||
|
||||
mPm = getPackageManager();
|
||||
// Get the preferences we're going to use in this Activity...
|
||||
AppDetails old = (AppDetails) getLastNonConfigurationInstance();
|
||||
@ -258,6 +285,8 @@ public class AppDetails extends ListActivity {
|
||||
.getDefaultSharedPreferences(getBaseContext());
|
||||
pref_expert = prefs.getBoolean("expert", false);
|
||||
pref_permissions = prefs.getBoolean("showPermissions", false);
|
||||
pref_incompatibleVersions = prefs.getBoolean(
|
||||
"incompatibleVersions", false);
|
||||
|
||||
startViews();
|
||||
|
||||
@ -265,6 +294,7 @@ public class AppDetails extends ListActivity {
|
||||
|
||||
private boolean pref_expert;
|
||||
private boolean pref_permissions;
|
||||
private boolean pref_incompatibleVersions;
|
||||
private boolean resetRequired;
|
||||
|
||||
// The signature of the installed version.
|
||||
@ -308,11 +338,6 @@ public class AppDetails extends ListActivity {
|
||||
super.onPause();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStop() {
|
||||
super.onStop();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object onRetainNonConfigurationInstance() {
|
||||
stateRetained = true;
|
||||
@ -418,14 +443,17 @@ public class AppDetails extends ListActivity {
|
||||
|
||||
// Set the icon...
|
||||
ImageView iv = (ImageView) findViewById(R.id.icon);
|
||||
ImageLoader.getInstance().displayImage(app.iconUrl, iv);
|
||||
ImageLoader.getInstance().displayImage(app.iconUrl, iv,
|
||||
displayImageOptions);
|
||||
|
||||
// Set the title and other header details...
|
||||
TextView tv = (TextView) findViewById(R.id.title);
|
||||
tv.setText(app.name);
|
||||
tv = (TextView) findViewById(R.id.license);
|
||||
tv.setText(app.license);
|
||||
tv = (TextView) findViewById(R.id.status);
|
||||
|
||||
tv = (TextView) findViewById(R.id.categories);
|
||||
tv.setText(app.categories.toString().replaceAll(",",", "));
|
||||
|
||||
tv = (TextView) infoView.findViewById(R.id.description);
|
||||
|
||||
@ -474,8 +502,7 @@ public class AppDetails extends ListActivity {
|
||||
if (listNum == -1) {
|
||||
output.append("\t• ");
|
||||
} else {
|
||||
output.append("\t" + Integer.toString(listNum)
|
||||
+ ". ");
|
||||
output.append("\t").append(Integer.toString(listNum)).append(". ");
|
||||
listNum++;
|
||||
}
|
||||
} else {
|
||||
@ -510,7 +537,7 @@ public class AppDetails extends ListActivity {
|
||||
String permissionName = permissions.next();
|
||||
try {
|
||||
Permission permission = new Permission(this, permissionName);
|
||||
sb.append("\t• " + permission.getName() + '\n');
|
||||
sb.append("\t• ").append(permission.getName()).append('\n');
|
||||
} catch (NameNotFoundException e) {
|
||||
if (permissionName.equals("ACCESS_SUPERUSER")) {
|
||||
sb.append("\t• Full permissions to all device features and storage\n");
|
||||
@ -537,7 +564,7 @@ public class AppDetails extends ListActivity {
|
||||
for (String af : app.antiFeatures) {
|
||||
String afdesc = descAntiFeature(af);
|
||||
if (afdesc != null) {
|
||||
sb.append("\t• " + afdesc + "\n");
|
||||
sb.append("\t• ").append(afdesc).append("\n");
|
||||
}
|
||||
}
|
||||
if (sb.length() > 0) {
|
||||
@ -611,7 +638,6 @@ public class AppDetails extends ListActivity {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog,
|
||||
int whichButton) {
|
||||
return;
|
||||
}
|
||||
});
|
||||
AlertDialog alert = ask_alrt.create();
|
||||
@ -687,6 +713,7 @@ public class AppDetails extends ListActivity {
|
||||
}
|
||||
|
||||
if (app.detail_bitcoinAddr != null || app.detail_litecoinAddr != null ||
|
||||
app.detail_dogecoinAddr != null ||
|
||||
app.detail_flattrID != null || app.detail_donateURL != null) {
|
||||
SubMenu donate = menu.addSubMenu(Menu.NONE, DONATE, 7,
|
||||
R.string.menu_donate).setIcon(
|
||||
@ -695,6 +722,8 @@ public class AppDetails extends ListActivity {
|
||||
donate.add(Menu.NONE, BITCOIN, 8, R.string.menu_bitcoin);
|
||||
if (app.detail_litecoinAddr != null)
|
||||
donate.add(Menu.NONE, LITECOIN, 8, R.string.menu_litecoin);
|
||||
if (app.detail_dogecoinAddr != null)
|
||||
donate.add(Menu.NONE, DOGECOIN, 8, R.string.menu_dogecoin);
|
||||
if (app.detail_flattrID != null)
|
||||
donate.add(Menu.NONE, FLATTR, 9, R.string.menu_flattr);
|
||||
if (app.detail_donateURL != null)
|
||||
@ -776,6 +805,10 @@ public class AppDetails extends ListActivity {
|
||||
tryOpenUri("litecoin:" + app.detail_litecoinAddr);
|
||||
return true;
|
||||
|
||||
case DOGECOIN:
|
||||
tryOpenUri("dogecoin:" + app.detail_dogecoinAddr);
|
||||
return true;
|
||||
|
||||
case FLATTR:
|
||||
tryOpenUri("https://flattr.com/thing/" + app.detail_flattrID);
|
||||
return true;
|
||||
@ -824,7 +857,6 @@ public class AppDetails extends ListActivity {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog,
|
||||
int whichButton) {
|
||||
return;
|
||||
}
|
||||
});
|
||||
AlertDialog alert = ask_alrt.create();
|
||||
|
@ -204,8 +204,9 @@ public class AppListManager {
|
||||
}
|
||||
if (app.installedVersion != null) {
|
||||
installedApps.addItem(app);
|
||||
if (app.toUpdate)
|
||||
if (app.toUpdate) {
|
||||
canUpgradeApps.addItem(app);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -215,8 +216,7 @@ public class AppListManager {
|
||||
Collections.sort(availApps, new RecentlyUpdatedComparator());
|
||||
}
|
||||
|
||||
for (DB.App app : availApps)
|
||||
availableApps.addItem(app);
|
||||
availableApps.addItems(availApps);
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -228,6 +228,10 @@ public class AppListManager {
|
||||
}
|
||||
}
|
||||
|
||||
public String getCurrentCategory() {
|
||||
return this.currentCategory;
|
||||
}
|
||||
|
||||
static class WhatsNewComparator implements Comparator<DB.App> {
|
||||
@Override
|
||||
public int compare(DB.App lhs, DB.App rhs) {
|
||||
|
@ -58,7 +58,7 @@ import org.fdroid.fdroid.compat.ContextCompat;
|
||||
public class DB {
|
||||
|
||||
private static Semaphore dbSync = new Semaphore(1, true);
|
||||
static DB dbInstance = null;
|
||||
private static DB dbInstance = null;
|
||||
|
||||
// Initialise the database. Called once when the application starts up.
|
||||
static void initDB(Context ctx) {
|
||||
@ -102,12 +102,13 @@ public class DB {
|
||||
+ "curVersion text," + "curVercode integer,"
|
||||
+ "antiFeatures string," + "donateURL string,"
|
||||
+ "bitcoinAddr string," + "litecoinAddr string,"
|
||||
+ "dogecoinAddr string,"
|
||||
+ "flattrID string," + "requirements string,"
|
||||
+ "categories string," + "added string,"
|
||||
+ "lastUpdated string," + "compatible int not null,"
|
||||
+ "ignoreAllUpdates int not null,"
|
||||
+ "ignoreThisUpdate int not null,"
|
||||
+ "primary key(id));";
|
||||
+ "provides string," + "primary key(id));";
|
||||
|
||||
public static class App implements Comparable<App> {
|
||||
|
||||
@ -122,8 +123,10 @@ public class DB {
|
||||
detail_donateURL = null;
|
||||
detail_bitcoinAddr = null;
|
||||
detail_litecoinAddr = null;
|
||||
detail_dogecoinAddr = null;
|
||||
detail_webURL = null;
|
||||
categories = null;
|
||||
provides = null;
|
||||
antiFeatures = null;
|
||||
requirements = null;
|
||||
hasUpdates = false;
|
||||
@ -177,6 +180,10 @@ public class DB {
|
||||
// Null when !detail_Populated
|
||||
public String detail_litecoinAddr;
|
||||
|
||||
// Dogecoin donate address, or null
|
||||
// Null when !detail_Populated
|
||||
public String detail_dogecoinAddr;
|
||||
|
||||
// Flattr donate ID, or null
|
||||
// Null when !detail_Populated
|
||||
public String detail_flattrID;
|
||||
@ -194,6 +201,9 @@ public class DB {
|
||||
public int installedVerCode;
|
||||
public boolean userInstalled;
|
||||
|
||||
// List of app IDs that this app provides or null if there aren't any.
|
||||
public CommaSeparatedList provides;
|
||||
|
||||
// List of categories (as defined in the metadata
|
||||
// documentation) or null if there aren't any.
|
||||
public CommaSeparatedList categories;
|
||||
@ -246,7 +256,8 @@ public class DB {
|
||||
int latestcode = -1;
|
||||
Apk latestapk = null;
|
||||
for (Apk apk : apks) {
|
||||
if (apk.compatible && apk.vercode <= curVercode
|
||||
if ((!this.compatible || apk.compatible)
|
||||
&& apk.vercode <= curVercode
|
||||
&& apk.vercode > latestcode) {
|
||||
latestapk = apk;
|
||||
latestcode = apk.vercode;
|
||||
@ -260,7 +271,8 @@ public class DB {
|
||||
int latestcode = -1;
|
||||
Apk latestapk = null;
|
||||
for (Apk apk : apks) {
|
||||
if (apk.compatible && apk.vercode > latestcode) {
|
||||
if ((!this.compatible || apk.compatible)
|
||||
&& apk.vercode > latestcode) {
|
||||
latestapk = apk;
|
||||
latestcode = apk.vercode;
|
||||
}
|
||||
@ -339,38 +351,14 @@ public class DB {
|
||||
|
||||
// Call isCompatible(apk) on an instance of this class to
|
||||
// check if an APK is compatible with the user's device.
|
||||
public static abstract class CompatibilityChecker extends Compatibility {
|
||||
|
||||
public abstract boolean isCompatible(Apk apk);
|
||||
|
||||
public static CompatibilityChecker getChecker(Context ctx) {
|
||||
CompatibilityChecker checker;
|
||||
if (hasApi(5))
|
||||
checker = new EclairChecker(ctx);
|
||||
else
|
||||
checker = new BasicChecker();
|
||||
Log.d("FDroid", "Compatibility checker for API level "
|
||||
+ getApi() + ": " + checker.getClass().getName());
|
||||
return checker;
|
||||
}
|
||||
}
|
||||
|
||||
private static class BasicChecker extends CompatibilityChecker {
|
||||
@Override
|
||||
public boolean isCompatible(Apk apk) {
|
||||
return hasApi(apk.minSdkVersion);
|
||||
}
|
||||
}
|
||||
|
||||
@TargetApi(5)
|
||||
private static class EclairChecker extends CompatibilityChecker {
|
||||
private static class CompatibilityChecker extends Compatibility {
|
||||
|
||||
private HashSet<String> features;
|
||||
private List<String> cpuAbis;
|
||||
private boolean ignoreTouchscreen;
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
public EclairChecker(Context ctx) {
|
||||
//@SuppressLint("NewApi")
|
||||
public CompatibilityChecker(Context ctx) {
|
||||
|
||||
SharedPreferences prefs = PreferenceManager
|
||||
.getDefaultSharedPreferences(ctx);
|
||||
@ -381,10 +369,12 @@ public class DB {
|
||||
StringBuilder logMsg = new StringBuilder();
|
||||
logMsg.append("Available device features:");
|
||||
features = new HashSet<String>();
|
||||
for (FeatureInfo fi : pm.getSystemAvailableFeatures()) {
|
||||
features.add(fi.name);
|
||||
logMsg.append('\n');
|
||||
logMsg.append(fi.name);
|
||||
if (pm != null) {
|
||||
for (FeatureInfo fi : pm.getSystemAvailableFeatures()) {
|
||||
features.add(fi.name);
|
||||
logMsg.append('\n');
|
||||
logMsg.append(fi.name);
|
||||
}
|
||||
}
|
||||
|
||||
cpuAbis = new ArrayList<String>();
|
||||
@ -405,7 +395,6 @@ public class DB {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCompatible(Apk apk) {
|
||||
if (!hasApi(apk.minSdkVersion))
|
||||
return false;
|
||||
@ -541,13 +530,13 @@ public class DB {
|
||||
}
|
||||
}
|
||||
|
||||
private final int DBVersion = 31;
|
||||
private final int DBVersion = 33;
|
||||
|
||||
private int countAppsForRepo(int id) {
|
||||
private int countAppsForRepo(int id) {
|
||||
String[] selection = { "COUNT(distinct id)" };
|
||||
String[] selectionArgs = { Integer.toString(id) };
|
||||
Cursor result = db.query(
|
||||
TABLE_APK, selection, "repo = ?", selectionArgs, "repo", null, null);
|
||||
TABLE_APK, selection, "repo = ?", selectionArgs, "repo", null, null);
|
||||
if (result.getCount() > 0) {
|
||||
result.moveToFirst();
|
||||
return result.getInt(0);
|
||||
@ -731,7 +720,7 @@ public class DB {
|
||||
db.execSQL("alter table " + TABLE_REPO + " add column maxage integer not null default 0");
|
||||
}
|
||||
|
||||
if (oldVersion < 31) {
|
||||
if (oldVersion < 33) {
|
||||
if (!columnExists(db, TABLE_REPO, "lastUpdated"))
|
||||
db.execSQL("Alter table " + TABLE_REPO + " add column lastUpdated string");
|
||||
}
|
||||
@ -832,7 +821,7 @@ public class DB {
|
||||
|
||||
private static final String[] POPULATE_APP_COLS = new String[] {
|
||||
"description", "webURL", "trackerURL", "sourceURL",
|
||||
"donateURL", "bitcoinAddr", "flattrID", "litecoinAddr" };
|
||||
"donateURL", "bitcoinAddr", "flattrID", "litecoinAddr", "dogecoinAddr" };
|
||||
|
||||
private void populateAppDetails(App app) {
|
||||
Cursor cursor = null;
|
||||
@ -848,6 +837,7 @@ public class DB {
|
||||
app.detail_bitcoinAddr = cursor.getString(5);
|
||||
app.detail_flattrID = cursor.getString(6);
|
||||
app.detail_litecoinAddr = cursor.getString(7);
|
||||
app.detail_dogecoinAddr = cursor.getString(8);
|
||||
app.detail_Populated = true;
|
||||
} catch (Exception e) {
|
||||
Log.d("FDroid", "Error populating app details " + app.id );
|
||||
@ -942,7 +932,8 @@ public class DB {
|
||||
String cols[] = new String[] { "antiFeatures", "requirements",
|
||||
"categories", "id", "name", "summary", "icon", "license",
|
||||
"curVersion", "curVercode", "added", "lastUpdated",
|
||||
"compatible", "ignoreAllUpdates", "ignoreThisUpdate" };
|
||||
"compatible", "ignoreAllUpdates", "ignoreThisUpdate",
|
||||
"provides" };
|
||||
c = db.query(TABLE_APP, cols, null, null, null, null, null);
|
||||
c.moveToFirst();
|
||||
while (!c.isAfterLast()) {
|
||||
@ -968,6 +959,7 @@ public class DB {
|
||||
app.compatible = c.getInt(12) == 1;
|
||||
app.ignoreAllUpdates = c.getInt(13) == 1;
|
||||
app.ignoreThisUpdate = c.getInt(14);
|
||||
app.provides = DB.CommaSeparatedList.make(c.getString(15));
|
||||
app.hasUpdates = false;
|
||||
|
||||
if (getinstalledinfo && systemApks.containsKey(app.id)) {
|
||||
@ -976,8 +968,10 @@ public class DB {
|
||||
if (app.installedVersion == null)
|
||||
app.installedVersion = "null";
|
||||
app.installedVerCode = sysapk.versionCode;
|
||||
app.userInstalled = ((sysapk.applicationInfo.flags
|
||||
& ApplicationInfo.FLAG_SYSTEM) != 1);
|
||||
if (sysapk.applicationInfo != null) {
|
||||
app.userInstalled = ((sysapk.applicationInfo.flags
|
||||
& ApplicationInfo.FLAG_SYSTEM) != 1);
|
||||
}
|
||||
} else {
|
||||
app.installedVersion = null;
|
||||
app.installedVerCode = 0;
|
||||
@ -985,6 +979,11 @@ public class DB {
|
||||
}
|
||||
|
||||
apps.put(app.id, app);
|
||||
if (app.provides != null) {
|
||||
for (String id : app.provides) {
|
||||
apps.put(id, app);
|
||||
}
|
||||
}
|
||||
|
||||
c.moveToNext();
|
||||
}
|
||||
@ -997,8 +996,6 @@ public class DB {
|
||||
List<Repo> repos = getRepos();
|
||||
SharedPreferences prefs = PreferenceManager
|
||||
.getDefaultSharedPreferences(mContext);
|
||||
boolean incompatibleVersions = prefs
|
||||
.getBoolean("incompatibleVersions", false);
|
||||
cols = new String[] { "id", "version", "vercode", "sig", "srcname",
|
||||
"apkName", "minSdkVersion", "added", "features", "nativecode",
|
||||
"compatible", "repo" };
|
||||
@ -1014,24 +1011,22 @@ public class DB {
|
||||
}
|
||||
boolean compatible = c.getInt(10) == 1;
|
||||
int repoid = c.getInt(11);
|
||||
if (compatible || incompatibleVersions) {
|
||||
Apk apk = new Apk();
|
||||
apk.id = id;
|
||||
apk.version = c.getString(1);
|
||||
apk.vercode = c.getInt(2);
|
||||
apk.sig = c.getString(3);
|
||||
apk.srcname = c.getString(4);
|
||||
apk.apkName = c.getString(5);
|
||||
apk.minSdkVersion = c.getInt(6);
|
||||
String sApkAdded = c.getString(7);
|
||||
apk.added = (sApkAdded == null || sApkAdded.length() == 0) ? null
|
||||
: mDateFormat.parse(sApkAdded);
|
||||
apk.features = CommaSeparatedList.make(c.getString(8));
|
||||
apk.nativecode = CommaSeparatedList.make(c.getString(9));
|
||||
apk.compatible = compatible;
|
||||
apk.repo = repoid;
|
||||
app.apks.add(apk);
|
||||
}
|
||||
Apk apk = new Apk();
|
||||
apk.id = id;
|
||||
apk.version = c.getString(1);
|
||||
apk.vercode = c.getInt(2);
|
||||
apk.sig = c.getString(3);
|
||||
apk.srcname = c.getString(4);
|
||||
apk.apkName = c.getString(5);
|
||||
apk.minSdkVersion = c.getInt(6);
|
||||
String sApkAdded = c.getString(7);
|
||||
apk.added = (sApkAdded == null || sApkAdded.length() == 0) ? null
|
||||
: mDateFormat.parse(sApkAdded);
|
||||
apk.features = CommaSeparatedList.make(c.getString(8));
|
||||
apk.nativecode = CommaSeparatedList.make(c.getString(9));
|
||||
apk.compatible = compatible;
|
||||
apk.repo = repoid;
|
||||
app.apks.add(apk);
|
||||
if (app.iconUrl == null && app.icon != null) {
|
||||
for (DB.Repo repo : repos) {
|
||||
if (repo.id == repoid) {
|
||||
@ -1146,7 +1141,7 @@ public class DB {
|
||||
try {
|
||||
String filter = "%" + query + "%";
|
||||
c = db.query(TABLE_APP, new String[] { "id" },
|
||||
"id like ? or name like ? or summary like ? or description like ?",
|
||||
"id like ? or provides like ? or name like ? or summary like ? or description like ?",
|
||||
new String[] { filter, filter, filter, filter }, null, null, null);
|
||||
c.moveToFirst();
|
||||
while (!c.isAfterLast()) {
|
||||
@ -1191,9 +1186,8 @@ public class DB {
|
||||
}
|
||||
|
||||
public boolean contains(String v) {
|
||||
Iterator<String> it = iterator();
|
||||
while (it.hasNext()) {
|
||||
if (it.next().equals(v))
|
||||
for (String s : this) {
|
||||
if (s.equals(v))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@ -1252,7 +1246,6 @@ public class DB {
|
||||
Log.d("FDroid", "AppUpdate: " + updateApps.size()
|
||||
+ " apps on completion.");
|
||||
updateApps = null;
|
||||
return;
|
||||
}
|
||||
|
||||
// Called instead of endUpdate if the update failed.
|
||||
@ -1273,8 +1266,9 @@ public class DB {
|
||||
}
|
||||
|
||||
// Lazy initialise this...
|
||||
if (compatChecker == null)
|
||||
compatChecker = Apk.CompatibilityChecker.getChecker(mContext);
|
||||
if (compatChecker == null) {
|
||||
compatChecker = new Apk.CompatibilityChecker(mContext);
|
||||
}
|
||||
|
||||
// See if it's compatible (by which we mean if it has at least one
|
||||
// compatible apk)
|
||||
@ -1346,6 +1340,7 @@ public class DB {
|
||||
values.put("donateURL", upapp.detail_donateURL);
|
||||
values.put("bitcoinAddr", upapp.detail_bitcoinAddr);
|
||||
values.put("litecoinAddr", upapp.detail_litecoinAddr);
|
||||
values.put("dogecoinAddr", upapp.detail_dogecoinAddr);
|
||||
values.put("flattrID", upapp.detail_flattrID);
|
||||
values.put("added",
|
||||
upapp.added == null ? "" : mDateFormat.format(upapp.added));
|
||||
|
@ -28,7 +28,6 @@ import android.app.AlertDialog;
|
||||
import android.app.AlertDialog.Builder;
|
||||
import android.app.NotificationManager;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
@ -59,7 +58,6 @@ public class FDroid extends FragmentActivity {
|
||||
private static final int SEARCH = Menu.FIRST + 4;
|
||||
|
||||
private ViewPager viewPager;
|
||||
private AppListFragmentPageAdapter viewPageAdapter;
|
||||
|
||||
private AppListManager manager = null;
|
||||
|
||||
@ -248,7 +246,7 @@ public class FDroid extends FragmentActivity {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog,
|
||||
int whichButton) {
|
||||
// do nothing
|
||||
// do nothing
|
||||
}
|
||||
});
|
||||
AlertDialog alert = ask_alrt.create();
|
||||
@ -283,7 +281,7 @@ public class FDroid extends FragmentActivity {
|
||||
|
||||
private void createViews() {
|
||||
viewPager = (ViewPager)findViewById(R.id.main_pager);
|
||||
viewPageAdapter = new AppListFragmentPageAdapter(this);
|
||||
AppListFragmentPageAdapter viewPageAdapter = new AppListFragmentPageAdapter(this);
|
||||
viewPager.setAdapter(viewPageAdapter);
|
||||
viewPager.setOnPageChangeListener( new ViewPager.SimpleOnPageChangeListener() {
|
||||
@Override
|
||||
@ -342,7 +340,7 @@ public class FDroid extends FragmentActivity {
|
||||
public void removeNotification(int id) {
|
||||
NotificationManager nMgr = (NotificationManager) getBaseContext()
|
||||
.getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
nMgr.cancel(1);
|
||||
nMgr.cancel(id);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -24,21 +24,16 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.Semaphore;
|
||||
|
||||
import android.os.Build;
|
||||
import android.app.Application;
|
||||
import android.app.Activity;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.util.Log;
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.graphics.Bitmap;
|
||||
|
||||
import com.nostra13.universalimageloader.utils.StorageUtils;
|
||||
import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache;
|
||||
import com.nostra13.universalimageloader.cache.disc.impl.LimitedAgeDiscCache;
|
||||
import com.nostra13.universalimageloader.cache.disc.naming.FileNameGenerator;
|
||||
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
|
||||
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
|
||||
import com.nostra13.universalimageloader.core.DisplayImageOptions;
|
||||
import com.nostra13.universalimageloader.core.ImageLoader;
|
||||
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
|
||||
|
||||
@ -104,31 +99,24 @@ public class FDroidApp extends Application {
|
||||
DB.initDB(ctx);
|
||||
UpdateService.schedule(ctx);
|
||||
|
||||
DisplayImageOptions options = new DisplayImageOptions.Builder()
|
||||
.cacheInMemory(true)
|
||||
.cacheOnDisc(true)
|
||||
.showImageOnLoading(R.drawable.ic_repo_app_default)
|
||||
.showImageForEmptyUri(R.drawable.ic_repo_app_default)
|
||||
.displayer(new FadeInBitmapDisplayer(200, true, true, false))
|
||||
.bitmapConfig(Bitmap.Config.RGB_565)
|
||||
.build();
|
||||
|
||||
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(ctx)
|
||||
.discCache(new UnlimitedDiscCache(
|
||||
.discCache(new LimitedAgeDiscCache(
|
||||
new File(StorageUtils.getCacheDirectory(ctx), "icons"),
|
||||
new FileNameGenerator() {
|
||||
@Override
|
||||
public String generate(String imageUri) {
|
||||
return imageUri.substring(
|
||||
imageUri.lastIndexOf('/') + 1);
|
||||
} } ))
|
||||
.defaultDisplayImageOptions(options)
|
||||
} },
|
||||
// 30 days in secs: 30*24*60*60 = 2592000
|
||||
2592000)
|
||||
)
|
||||
.threadPoolSize(Runtime.getRuntime().availableProcessors() * 2)
|
||||
.build();
|
||||
ImageLoader.getInstance().init(config);
|
||||
}
|
||||
|
||||
Context ctx;
|
||||
private Context ctx;
|
||||
|
||||
// Global list of all known applications.
|
||||
private List<DB.App> apps;
|
||||
|
@ -313,9 +313,8 @@ public class ManageRepo extends ListActivity {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
setResult(Activity.RESULT_CANCELED);
|
||||
if (isImportingRepo) {
|
||||
finish();
|
||||
}
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
});
|
||||
alrt.show();
|
||||
@ -420,8 +419,54 @@ public class ManageRepo extends ListActivity {
|
||||
if (item.getItemId() == ADD_REPO) {
|
||||
showAddRepo();
|
||||
return true;
|
||||
} else if (item.getItemId() == UPDATE_REPOS) {
|
||||
updateRepos();
|
||||
|
||||
case REM_REPO:
|
||||
final List<String> rem_lst = new ArrayList<String>();
|
||||
CharSequence[] b = new CharSequence[repos.size()];
|
||||
for (int i = 0; i < repos.size(); i++) {
|
||||
b[i] = repos.get(i).address;
|
||||
}
|
||||
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
builder.setTitle(getString(R.string.repo_delete_title));
|
||||
builder.setIcon(android.R.drawable.ic_menu_close_clear_cancel);
|
||||
builder.setMultiChoiceItems(b, null,
|
||||
new DialogInterface.OnMultiChoiceClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog,
|
||||
int whichButton, boolean isChecked) {
|
||||
if (isChecked) {
|
||||
rem_lst.add(repos.get(whichButton).address);
|
||||
} else {
|
||||
rem_lst.remove(repos.get(whichButton).address);
|
||||
}
|
||||
}
|
||||
});
|
||||
builder.setPositiveButton(getString(R.string.ok),
|
||||
new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog,
|
||||
int whichButton) {
|
||||
try {
|
||||
DB db = DB.getDB();
|
||||
removeRepos(rem_lst);
|
||||
} finally {
|
||||
DB.releaseDB();
|
||||
}
|
||||
changed = true;
|
||||
redraw();
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(getString(R.string.cancel),
|
||||
new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog,
|
||||
int whichButton) {
|
||||
return;
|
||||
}
|
||||
});
|
||||
AlertDialog alert = builder.create();
|
||||
alert.show();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -4,7 +4,6 @@ import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.prefs.PreferenceChangeListener;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
@ -27,7 +26,20 @@ public class Preferences implements SharedPreferences.OnSharedPreferenceChangeLi
|
||||
preferences.registerOnSharedPreferenceChangeListener(this);
|
||||
}
|
||||
|
||||
private static final String PREF_COMPACT_LAYOUT = "compactlayout";
|
||||
public static final String PREF_UPD_INTERVAL = "updateInterval";
|
||||
public static final String PREF_UPD_WIFI_ONLY = "updateOnWifiOnly";
|
||||
public static final String PREF_UPD_NOTIFY = "updateNotify";
|
||||
public static final String PREF_UPD_HISTORY = "updateHistoryDays";
|
||||
public static final String PREF_ROOTED = "rooted";
|
||||
public static final String PREF_INCOMP_VER = "incompatibleVersions";
|
||||
public static final String PREF_THEME = "theme";
|
||||
public static final String PREF_PERMISSIONS = "showPermissions";
|
||||
public static final String PREF_COMPACT_LAYOUT = "compactlayout";
|
||||
public static final String PREF_IGN_TOUCH = "ignoreTouchscreen";
|
||||
public static final String PREF_CACHE_APK = "cacheDownloaded";
|
||||
public static final String PREF_EXPERT = "expert";
|
||||
public static final String PREF_DB_SYNC = "dbSyncMode";
|
||||
|
||||
private static final boolean DEFAULT_COMPACT_LAYOUT = false;
|
||||
|
||||
private boolean compactLayout = DEFAULT_COMPACT_LAYOUT;
|
||||
|
@ -21,41 +21,157 @@ package org.fdroid.fdroid;
|
||||
import android.os.Bundle;
|
||||
import android.preference.Preference;
|
||||
import android.preference.PreferenceActivity;
|
||||
import android.preference.Preference.OnPreferenceChangeListener;
|
||||
import android.preference.ListPreference;
|
||||
import android.preference.CheckBoxPreference;
|
||||
import android.preference.EditTextPreference;
|
||||
import android.preference.ListPreference;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
|
||||
import android.view.MenuItem;
|
||||
|
||||
import android.support.v4.app.NavUtils;
|
||||
|
||||
import org.fdroid.fdroid.Preferences;
|
||||
import org.fdroid.fdroid.compat.ActionBarCompat;
|
||||
|
||||
public class PreferencesActivity extends PreferenceActivity implements
|
||||
OnPreferenceChangeListener {
|
||||
OnSharedPreferenceChangeListener {
|
||||
|
||||
public static final int RESULT_RELOAD = 1;
|
||||
public static final int RESULT_REFILTER = 2;
|
||||
public static final int RESULT_RESTART = 4;
|
||||
private int result = 0;
|
||||
|
||||
private static String[] summariesToUpdate = {
|
||||
Preferences.PREF_UPD_INTERVAL,
|
||||
Preferences.PREF_UPD_WIFI_ONLY,
|
||||
Preferences.PREF_UPD_NOTIFY,
|
||||
Preferences.PREF_UPD_HISTORY,
|
||||
Preferences.PREF_ROOTED,
|
||||
Preferences.PREF_INCOMP_VER,
|
||||
Preferences.PREF_THEME,
|
||||
Preferences.PREF_PERMISSIONS,
|
||||
Preferences.PREF_COMPACT_LAYOUT,
|
||||
Preferences.PREF_IGN_TOUCH,
|
||||
Preferences.PREF_CACHE_APK,
|
||||
Preferences.PREF_EXPERT,
|
||||
Preferences.PREF_DB_SYNC
|
||||
};
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
|
||||
((FDroidApp) getApplication()).applyTheme(this);
|
||||
|
||||
super.onCreate(savedInstanceState);
|
||||
ActionBarCompat.create(this).setDisplayHomeAsUpEnabled(true);
|
||||
addPreferencesFromResource(R.xml.preferences);
|
||||
for (String prefkey : new String[] {
|
||||
"updateInterval", "rooted", "incompatibleVersions",
|
||||
"theme" }) {
|
||||
findPreference(prefkey).setOnPreferenceChangeListener(this);
|
||||
}
|
||||
|
||||
protected void onoffSummary(String key, int on, int off) {
|
||||
CheckBoxPreference pref = (CheckBoxPreference)findPreference(key);
|
||||
if (pref.isChecked()) {
|
||||
pref.setSummary(on);
|
||||
} else {
|
||||
pref.setSummary(off);
|
||||
}
|
||||
CheckBoxPreference onlyOnWifi = (CheckBoxPreference)
|
||||
findPreference("updateOnWifiOnly");
|
||||
onlyOnWifi.setEnabled(Integer.parseInt(
|
||||
((ListPreference)findPreference("updateInterval"))
|
||||
.getValue()) > 0);
|
||||
}
|
||||
|
||||
protected void entrySummary(String key) {
|
||||
ListPreference pref = (ListPreference)findPreference(key);
|
||||
pref.setSummary(pref.getEntry());
|
||||
}
|
||||
|
||||
protected void textSummary(String key) {
|
||||
EditTextPreference pref = (EditTextPreference)findPreference(key);
|
||||
pref.setSummary(getString(R.string.update_history_summ,
|
||||
pref.getText()));
|
||||
}
|
||||
|
||||
|
||||
protected void updateSummary(String key) {
|
||||
|
||||
if (key.equals(Preferences.PREF_UPD_INTERVAL)) {
|
||||
ListPreference pref = (ListPreference)findPreference(
|
||||
Preferences.PREF_UPD_INTERVAL);
|
||||
int interval = Integer.parseInt(pref.getValue().toString());
|
||||
Preference onlyOnWifi = findPreference(
|
||||
Preferences.PREF_UPD_WIFI_ONLY);
|
||||
onlyOnWifi.setEnabled(interval > 0);
|
||||
if (interval == 0) {
|
||||
pref.setSummary(R.string.update_interval_zero);
|
||||
} else {
|
||||
pref.setSummary(pref.getEntry());
|
||||
}
|
||||
|
||||
} else if (key.equals(Preferences.PREF_UPD_WIFI_ONLY)) {
|
||||
onoffSummary(key, R.string.automatic_scan_wifi_on,
|
||||
R.string.automatic_scan_wifi_off);
|
||||
|
||||
} else if (key.equals(Preferences.PREF_UPD_NOTIFY)) {
|
||||
onoffSummary(key, R.string.notify_on,
|
||||
R.string.notify_off);
|
||||
|
||||
} else if (key.equals(Preferences.PREF_UPD_HISTORY)) {
|
||||
textSummary(key);
|
||||
|
||||
} else if (key.equals(Preferences.PREF_PERMISSIONS)) {
|
||||
onoffSummary(key, R.string.showPermissions_on,
|
||||
R.string.showPermissions_off);
|
||||
|
||||
} else if (key.equals(Preferences.PREF_COMPACT_LAYOUT)) {
|
||||
onoffSummary(key, R.string.compactlayout_on,
|
||||
R.string.compactlayout_off);
|
||||
|
||||
} else if (key.equals(Preferences.PREF_THEME)) {
|
||||
entrySummary(key);
|
||||
result |= RESULT_RESTART;
|
||||
setResult(result);
|
||||
|
||||
} else if (key.equals(Preferences.PREF_INCOMP_VER)) {
|
||||
onoffSummary(key, R.string.show_incompat_versions_on,
|
||||
R.string.show_incompat_versions_off);
|
||||
result ^= RESULT_RELOAD;
|
||||
setResult(result);
|
||||
|
||||
} else if (key.equals(Preferences.PREF_ROOTED)) {
|
||||
onoffSummary(key, R.string.rooted_on,
|
||||
R.string.rooted_off);
|
||||
result ^= RESULT_REFILTER;
|
||||
setResult(result);
|
||||
|
||||
} else if (key.equals(Preferences.PREF_IGN_TOUCH)) {
|
||||
onoffSummary(key, R.string.ignoreTouch_on,
|
||||
R.string.ignoreTouch_off);
|
||||
|
||||
} else if (key.equals(Preferences.PREF_CACHE_APK)) {
|
||||
onoffSummary(key, R.string.cache_downloaded_on,
|
||||
R.string.cache_downloaded_off);
|
||||
|
||||
} else if (key.equals(Preferences.PREF_EXPERT)) {
|
||||
onoffSummary(key, R.string.expert_on,
|
||||
R.string.expert_off);
|
||||
|
||||
} else if (key.equals(Preferences.PREF_DB_SYNC)) {
|
||||
entrySummary(key);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
|
||||
super.onResume();
|
||||
getPreferenceScreen().getSharedPreferences()
|
||||
.registerOnSharedPreferenceChangeListener(
|
||||
(OnSharedPreferenceChangeListener)this);
|
||||
|
||||
for (String key : summariesToUpdate) {
|
||||
updateSummary(key);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
getPreferenceScreen().getSharedPreferences()
|
||||
.unregisterOnSharedPreferenceChangeListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -69,31 +185,10 @@ public class PreferencesActivity extends PreferenceActivity implements
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||
String key = preference.getKey();
|
||||
if (key.equals("updateInterval")) {
|
||||
int interval = Integer.parseInt(newValue.toString());
|
||||
CheckBoxPreference onlyOnWifi = (CheckBoxPreference)
|
||||
findPreference("updateOnWifiOnly");
|
||||
onlyOnWifi.setEnabled(interval > 0);
|
||||
return true;
|
||||
}
|
||||
if (key.equals("incompatibleVersions")) {
|
||||
result ^= RESULT_RELOAD;
|
||||
setResult(result);
|
||||
return true;
|
||||
}
|
||||
if (key.equals("rooted")) {
|
||||
result ^= RESULT_REFILTER;
|
||||
setResult(result);
|
||||
return true;
|
||||
}
|
||||
if (key.equals("theme")) {
|
||||
result |= RESULT_RESTART;
|
||||
setResult(result);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
public void onSharedPreferenceChanged(
|
||||
SharedPreferences sharedPreferences, String key) {
|
||||
|
||||
updateSummary(key);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -34,6 +34,8 @@ import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.HashMap;
|
||||
import java.util.jar.JarEntry;
|
||||
import java.util.jar.JarFile;
|
||||
|
||||
@ -55,7 +57,8 @@ public class RepoXMLHandler extends DefaultHandler {
|
||||
// The repo we're processing.
|
||||
private DB.Repo repo;
|
||||
|
||||
private List<DB.App> apps;
|
||||
private Map<String, DB.App> apps;
|
||||
private List<DB.App> appsList;
|
||||
|
||||
private DB.App curapp = null;
|
||||
private DB.Apk curapk = null;
|
||||
@ -89,9 +92,11 @@ public class RepoXMLHandler extends DefaultHandler {
|
||||
|
||||
private int totalAppCount;
|
||||
|
||||
public RepoXMLHandler(DB.Repo repo, List<DB.App> apps, ProgressListener listener) {
|
||||
public RepoXMLHandler(DB.Repo repo, List<DB.App> appsList, ProgressListener listener) {
|
||||
this.repo = repo;
|
||||
this.apps = apps;
|
||||
this.apps = new HashMap<String, DB.App>();
|
||||
for (DB.App app : appsList) this.apps.put(app.id, app);
|
||||
this.appsList = appsList;
|
||||
pubkey = null;
|
||||
name = null;
|
||||
description = null;
|
||||
@ -118,18 +123,13 @@ public class RepoXMLHandler extends DefaultHandler {
|
||||
|
||||
// If we already have this application (must be from scanning a
|
||||
// different repo) then just merge in the apks.
|
||||
// TODO: Scanning the whole app list like this every time is
|
||||
// going to be stupid if the list gets very big!
|
||||
boolean merged = false;
|
||||
for (DB.App app : apps) {
|
||||
if (app.id.equals(curapp.id)) {
|
||||
app.apks.addAll(curapp.apks);
|
||||
merged = true;
|
||||
break;
|
||||
}
|
||||
DB.App app = apps.get(curapp.id);
|
||||
if (app != null) {
|
||||
app.apks.addAll(curapp.apks);
|
||||
} else {
|
||||
appsList.add(curapp);
|
||||
apps.put(curapp.id, curapp);
|
||||
}
|
||||
if (!merged)
|
||||
apps.add(curapp);
|
||||
|
||||
curapp = null;
|
||||
|
||||
@ -212,6 +212,8 @@ public class RepoXMLHandler extends DefaultHandler {
|
||||
curapp.detail_bitcoinAddr = str;
|
||||
} else if (curel.equals("litecoin")) {
|
||||
curapp.detail_litecoinAddr = str;
|
||||
} else if (curel.equals("dogecoin")) {
|
||||
curapp.detail_dogecoinAddr = str;
|
||||
} else if (curel.equals("flattr")) {
|
||||
curapp.detail_flattrID = str;
|
||||
} else if (curel.equals("web")) {
|
||||
@ -240,6 +242,8 @@ public class RepoXMLHandler extends DefaultHandler {
|
||||
} catch (NumberFormatException ex) {
|
||||
curapp.curVercode = -1;
|
||||
}
|
||||
} else if (curel.equals("provides")) {
|
||||
curapp.provides = DB.CommaSeparatedList.make(str);
|
||||
} else if (curel.equals("categories")) {
|
||||
curapp.categories = DB.CommaSeparatedList.make(str);
|
||||
} else if (curel.equals("antifeatures")) {
|
||||
@ -358,7 +362,7 @@ public class RepoXMLHandler extends DefaultHandler {
|
||||
// value for the index that was successfully processed, or it may contain
|
||||
// null if none was available.
|
||||
public static String doUpdate(Context ctx, DB.Repo repo,
|
||||
List<DB.App> apps, StringBuilder newetag, List<Integer> keeprepos,
|
||||
List<DB.App> appsList, StringBuilder newetag, List<Integer> keeprepos,
|
||||
ProgressListener progressListener) {
|
||||
try {
|
||||
|
||||
@ -443,7 +447,7 @@ public class RepoXMLHandler extends DefaultHandler {
|
||||
SAXParserFactory spf = SAXParserFactory.newInstance();
|
||||
SAXParser sp = spf.newSAXParser();
|
||||
XMLReader xr = sp.getXMLReader();
|
||||
RepoXMLHandler handler = new RepoXMLHandler(repo, apps, progressListener);
|
||||
RepoXMLHandler handler = new RepoXMLHandler(repo, appsList, progressListener);
|
||||
xr.setContentHandler(handler);
|
||||
|
||||
File tempIndex = new File(ctx.getFilesDir() + "/tempindex.xml");
|
||||
|
@ -92,11 +92,6 @@ public class SearchResults extends ListActivity {
|
||||
updateView();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
}
|
||||
|
||||
private void updateView() {
|
||||
|
||||
List<String> matchingids = new ArrayList<String>();
|
||||
@ -110,24 +105,20 @@ public class SearchResults extends ListActivity {
|
||||
}
|
||||
|
||||
List<DB.App> apps = new ArrayList<DB.App>();
|
||||
List<DB.App> tapps = ((FDroidApp) getApplication()).getApps();
|
||||
for (DB.App tapp : tapps) {
|
||||
List<DB.App> allApps = ((FDroidApp) getApplication()).getApps();
|
||||
for (DB.App app : allApps) {
|
||||
boolean include = false;
|
||||
for (String tid : matchingids) {
|
||||
if (tid.equals(tapp.id)) {
|
||||
include = true;
|
||||
for (String id : matchingids) {
|
||||
if (id.equals(app.id)) {
|
||||
apps.add(app);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (include)
|
||||
apps.add(tapp);
|
||||
|
||||
}
|
||||
|
||||
TextView tv = (TextView) findViewById(R.id.description);
|
||||
String headertext;
|
||||
try
|
||||
{
|
||||
try {
|
||||
if (apps.size() == 0)
|
||||
headertext = String.format(getString(R.string.searchres_noapps),
|
||||
mQuery);
|
||||
|
@ -1,5 +1,6 @@
|
||||
package org.fdroid.fdroid.compat;
|
||||
|
||||
import android.annotation.TargetApi;
|
||||
import android.app.ActionBar;
|
||||
import android.app.Activity;
|
||||
|
||||
@ -35,6 +36,7 @@ class OldActionBarCompatImpl extends ActionBarCompat {
|
||||
}
|
||||
}
|
||||
|
||||
@TargetApi(11)
|
||||
class HoneycombActionBarCompatImpl extends ActionBarCompat {
|
||||
|
||||
private final ActionBar actionBar;
|
||||
|
@ -2,8 +2,6 @@ package org.fdroid.fdroid.compat;
|
||||
|
||||
import android.os.Build;
|
||||
|
||||
import org.fdroid.fdroid.Utils;
|
||||
|
||||
public abstract class Compatibility {
|
||||
|
||||
protected static boolean hasApi(int apiLevel) {
|
||||
|
@ -2,6 +2,7 @@ package org.fdroid.fdroid.compat;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import android.annotation.TargetApi;
|
||||
import android.content.Context;
|
||||
import android.os.Environment;
|
||||
|
||||
@ -45,6 +46,7 @@ class OldContextCompatImpl extends ContextCompat {
|
||||
|
||||
}
|
||||
|
||||
@TargetApi(8)
|
||||
class FroyoContextCompatImpl extends ContextCompat {
|
||||
|
||||
public FroyoContextCompatImpl(Context context) {
|
||||
|
@ -1,6 +1,6 @@
|
||||
package org.fdroid.fdroid.compat;
|
||||
|
||||
import android.widget.RelativeLayout;
|
||||
import android.annotation.TargetApi;
|
||||
|
||||
public abstract class LayoutCompat extends Compatibility {
|
||||
|
||||
@ -30,6 +30,7 @@ class OldLayoutCompatImpl extends LayoutCompat {
|
||||
}
|
||||
}
|
||||
|
||||
@TargetApi(17)
|
||||
class JellyBeanMr1LayoutCompatImpl extends LayoutCompat {
|
||||
|
||||
@Override
|
||||
|
@ -1,5 +1,6 @@
|
||||
package org.fdroid.fdroid.compat;
|
||||
|
||||
import android.annotation.TargetApi;
|
||||
import android.app.Activity;
|
||||
|
||||
abstract public class MenuManager extends Compatibility {
|
||||
@ -34,6 +35,7 @@ class OldMenuManagerImpl extends MenuManager {
|
||||
|
||||
}
|
||||
|
||||
@TargetApi(11)
|
||||
class HoneycombMenuManagerImpl extends MenuManager {
|
||||
|
||||
protected HoneycombMenuManagerImpl(Activity activity) {
|
||||
|
@ -2,11 +2,13 @@ package org.fdroid.fdroid.compat;
|
||||
|
||||
import java.lang.Exception;
|
||||
|
||||
import android.annotation.TargetApi;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.util.Log;
|
||||
|
||||
public class PackageManagerCompat extends Compatibility {
|
||||
|
||||
@TargetApi(11)
|
||||
public static void setInstaller(PackageManager mPm, String app_id) {
|
||||
if (!hasApi(11)) return;
|
||||
try {
|
||||
|
@ -3,6 +3,7 @@ package org.fdroid.fdroid.compat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import android.annotation.TargetApi;
|
||||
import android.app.ActionBar;
|
||||
import android.app.FragmentTransaction;
|
||||
import android.content.res.Configuration;
|
||||
@ -98,7 +99,7 @@ class OldTabManagerImpl extends TabManager {
|
||||
|
||||
TabHost.TabSpec installedTabSpec = tabHost.newTabSpec("installed")
|
||||
.setIndicator(
|
||||
parent.getString(R.string.tab_installed),
|
||||
parent.getString(R.string.inst),
|
||||
parent.getResources().getDrawable(android.R.drawable.star_off))
|
||||
.setContent(factory);
|
||||
|
||||
@ -150,6 +151,7 @@ class OldTabManagerImpl extends TabManager {
|
||||
|
||||
}
|
||||
|
||||
@TargetApi(11)
|
||||
class HoneycombTabManagerImpl extends TabManager {
|
||||
|
||||
protected final ActionBar actionBar;
|
||||
@ -220,7 +222,6 @@ class HoneycombTabManagerImpl extends TabManager {
|
||||
private Spinner getActionBarSpinner() {
|
||||
if (actionBarSpinner == null && dirtyConfig) {
|
||||
dirtyConfig = false;
|
||||
long time = System.currentTimeMillis();
|
||||
actionBarSpinner = findActionBarSpinner();
|
||||
}
|
||||
return actionBarSpinner;
|
||||
|
@ -4,25 +4,45 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Typeface;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.*;
|
||||
import android.text.SpannableString;
|
||||
import android.text.style.StyleSpan;
|
||||
import android.graphics.Bitmap;
|
||||
|
||||
import org.fdroid.fdroid.DB;
|
||||
import org.fdroid.fdroid.Preferences;
|
||||
import org.fdroid.fdroid.R;
|
||||
import org.fdroid.fdroid.compat.LayoutCompat;
|
||||
|
||||
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
|
||||
import com.nostra13.universalimageloader.core.DisplayImageOptions;
|
||||
import com.nostra13.universalimageloader.core.ImageLoader;
|
||||
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
|
||||
|
||||
abstract public class AppListAdapter extends BaseAdapter {
|
||||
|
||||
private List<DB.App> items = new ArrayList<DB.App>();
|
||||
private Context mContext;
|
||||
private DisplayImageOptions displayImageOptions;
|
||||
|
||||
public AppListAdapter(Context context) {
|
||||
mContext = context;
|
||||
|
||||
displayImageOptions = new DisplayImageOptions.Builder()
|
||||
.cacheInMemory(true)
|
||||
.cacheOnDisc(true)
|
||||
.imageScaleType(ImageScaleType.NONE)
|
||||
.resetViewBeforeLoading(true)
|
||||
.showImageOnLoading(R.drawable.ic_repo_app_default)
|
||||
.showImageForEmptyUri(R.drawable.ic_repo_app_default)
|
||||
.displayer(new FadeInBitmapDisplayer(200, true, true, false))
|
||||
.bitmapConfig(Bitmap.Config.RGB_565)
|
||||
.build();
|
||||
|
||||
}
|
||||
|
||||
abstract protected boolean showStatusUpdate();
|
||||
@ -33,6 +53,10 @@ abstract public class AppListAdapter extends BaseAdapter {
|
||||
items.add(app);
|
||||
}
|
||||
|
||||
public void addItems(List<DB.App> apps) {
|
||||
items.addAll(apps);
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
items.clear();
|
||||
}
|
||||
@ -75,37 +99,12 @@ abstract public class AppListAdapter extends BaseAdapter {
|
||||
int visibleOnCompact = compact ? View.VISIBLE : View.GONE;
|
||||
int notVisibleOnCompact = compact ? View.GONE : View.VISIBLE;
|
||||
|
||||
LinearLayout iconContainer = (LinearLayout)convertView.findViewById(R.id.status_icons);
|
||||
layoutIcon(icon, compact);
|
||||
ImageLoader.getInstance().displayImage(app.iconUrl, icon,
|
||||
displayImageOptions);
|
||||
|
||||
iconContainer.setVisibility(visibleOnCompact);
|
||||
status.setVisibility(notVisibleOnCompact);
|
||||
license.setVisibility(notVisibleOnCompact);
|
||||
layoutSummary(summary);
|
||||
|
||||
ImageLoader.getInstance().displayImage(app.iconUrl, icon);
|
||||
|
||||
if (!compact) {
|
||||
status.setText(getVersionInfo(app));
|
||||
license.setText(app.license);
|
||||
} else {
|
||||
ImageView iconInstalled = (ImageView) convertView.findViewById(R.id.icon_status_installed);
|
||||
ImageView iconUpdates = (ImageView) convertView.findViewById(R.id.icon_status_has_updates);
|
||||
|
||||
iconInstalled.setImageResource(R.drawable.ic_cab_done_holo_dark);
|
||||
iconUpdates.setImageResource(R.drawable.ic_menu_refresh);
|
||||
|
||||
if (app.toUpdate && showStatusUpdate()) {
|
||||
iconUpdates.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
iconUpdates.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
if (app.installedVerCode > 0 && showStatusInstalled()) {
|
||||
iconInstalled.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
iconInstalled.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
status.setText(getVersionInfo(app));
|
||||
license.setText(app.license);
|
||||
|
||||
// Disable it all if it isn't compatible...
|
||||
View[] views = { convertView, status, summary, license, name };
|
||||
@ -116,51 +115,47 @@ abstract public class AppListAdapter extends BaseAdapter {
|
||||
return convertView;
|
||||
}
|
||||
|
||||
/**
|
||||
* In compact view, the summary sites next to the icon, below the name.
|
||||
* In non-compact view, it sits under the icon, with some padding pushing
|
||||
* it away from the left margin.
|
||||
*/
|
||||
private void layoutSummary(TextView summaryView) {
|
||||
|
||||
if (Preferences.get().hasCompactLayout()) {
|
||||
|
||||
RelativeLayout.LayoutParams summaryLayout =
|
||||
new RelativeLayout.LayoutParams(
|
||||
RelativeLayout.LayoutParams.WRAP_CONTENT,
|
||||
RelativeLayout.LayoutParams.WRAP_CONTENT);
|
||||
summaryLayout.addRule(RelativeLayout.BELOW, R.id.name);
|
||||
summaryLayout.addRule(LayoutCompat.RelativeLayout.END_OF, R.id.icon);
|
||||
summaryView.setLayoutParams(summaryLayout);
|
||||
summaryView.setPadding(0,0,0,0);
|
||||
|
||||
} else {
|
||||
|
||||
RelativeLayout.LayoutParams summaryLayout =
|
||||
new RelativeLayout.LayoutParams(
|
||||
RelativeLayout.LayoutParams.MATCH_PARENT,
|
||||
RelativeLayout.LayoutParams.WRAP_CONTENT);
|
||||
summaryLayout.addRule(RelativeLayout.BELOW, R.id.icon);
|
||||
summaryView.setLayoutParams(summaryLayout);
|
||||
float padding = mContext.getResources().getDimension(R.dimen.applist_summary_padding);
|
||||
summaryView.setPadding((int)padding, 0, 0, 0);
|
||||
|
||||
private String ellipsize(String input, int maxLength) {
|
||||
if (input == null || input.length() < maxLength+1) {
|
||||
return input;
|
||||
}
|
||||
return input.substring(0, maxLength) + "…";
|
||||
}
|
||||
|
||||
private String getVersionInfo(DB.App app) {
|
||||
if (app.installedVersion != null) {
|
||||
if (app.toUpdate) {
|
||||
return app.installedVersion + " -> " + app.curApk.version;
|
||||
}
|
||||
return app.installedVersion;
|
||||
} else {
|
||||
int numav = app.apks.size();
|
||||
if (numav == 1) {
|
||||
return mContext.getString(R.string.n_version_available, numav);
|
||||
}
|
||||
return mContext.getString(R.string.n_versions_available, numav);
|
||||
|
||||
if (app.curApk == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (app.installedVersion == null) {
|
||||
return ellipsize(app.curApk.version, 12);
|
||||
}
|
||||
|
||||
if (app.toUpdate && showStatusUpdate()) {
|
||||
return ellipsize(app.installedVersion, 8) +
|
||||
" → " + ellipsize(app.curApk.version, 8);
|
||||
}
|
||||
|
||||
if (app.installedVerCode > 0 && showStatusInstalled()) {
|
||||
return ellipsize(app.installedVersion, 12) + " ✔";
|
||||
}
|
||||
|
||||
return app.installedVersion;
|
||||
}
|
||||
|
||||
private void layoutIcon(ImageView icon, boolean compact) {
|
||||
int size = (int)mContext.getResources().getDimension((compact
|
||||
? R.dimen.applist_icon_compact_size
|
||||
: R.dimen.applist_icon_normal_size));
|
||||
|
||||
RelativeLayout.LayoutParams params =
|
||||
(RelativeLayout.LayoutParams)icon.getLayoutParams();
|
||||
|
||||
params.height = size;
|
||||
params.width = size;
|
||||
|
||||
icon.setLayoutParams(params);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -44,7 +44,7 @@ public class AppListFragmentPageAdapter extends FragmentPagerAdapter {
|
||||
case 0:
|
||||
return parent.getString(R.string.tab_noninstalled);
|
||||
case 1:
|
||||
return parent.getString(R.string.tab_installed);
|
||||
return parent.getString(R.string.inst);
|
||||
case 2:
|
||||
return parent.getString(R.string.tab_updates) + " ("
|
||||
+ parent.getManager().getCanUpdateAdapter().getCount() + ")";
|
||||
|
@ -16,10 +16,12 @@ import org.fdroid.fdroid.views.AppListView;
|
||||
|
||||
abstract class AppListFragment extends Fragment implements AdapterView.OnItemClickListener, Preferences.ChangeListener {
|
||||
|
||||
private FDroid parent;
|
||||
protected FDroid parent;
|
||||
|
||||
protected abstract AppListAdapter getAppListAdapter();
|
||||
|
||||
protected abstract String getFromTitle();
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
@ -76,6 +78,7 @@ abstract class AppListFragment extends Fragment implements AdapterView.OnItemCli
|
||||
final DB.App app = (DB.App)getAppListAdapter().getItem(position);
|
||||
Intent intent = new Intent(getActivity(), AppDetails.class);
|
||||
intent.putExtra("appid", app.id);
|
||||
intent.putExtra("from", getFromTitle());
|
||||
startActivityForResult(intent, FDroid.REQUEST_APPDETAILS);
|
||||
}
|
||||
|
||||
|
@ -57,4 +57,9 @@ public class AvailableAppsFragment extends AppListFragment implements AdapterVie
|
||||
protected AppListAdapter getAppListAdapter() {
|
||||
return getAppListManager().getAvailableAdapter();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getFromTitle() {
|
||||
return getAppListManager().getCurrentCategory();
|
||||
}
|
||||
}
|
||||
|
@ -5,6 +5,7 @@ import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import org.fdroid.fdroid.R;
|
||||
import org.fdroid.fdroid.views.AppListAdapter;
|
||||
|
||||
public class CanUpdateAppsFragment extends AppListFragment {
|
||||
@ -18,4 +19,9 @@ public class CanUpdateAppsFragment extends AppListFragment {
|
||||
protected AppListAdapter getAppListAdapter() {
|
||||
return getAppListManager().getCanUpdateAdapter();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getFromTitle() {
|
||||
return parent.getString(R.string.tab_updates);
|
||||
}
|
||||
}
|
||||
|
@ -5,6 +5,7 @@ import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import org.fdroid.fdroid.R;
|
||||
import org.fdroid.fdroid.views.AppListAdapter;
|
||||
|
||||
public class InstalledAppsFragment extends AppListFragment {
|
||||
@ -18,4 +19,9 @@ public class InstalledAppsFragment extends AppListFragment {
|
||||
protected AppListAdapter getAppListAdapter() {
|
||||
return getAppListManager().getInstalledAdapter();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getFromTitle() {
|
||||
return parent.getString(R.string.inst);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user