diff --git a/res/drawable/ic_cab_done_holo_dark.png b/res/drawable/ic_cab_done_holo_dark.png new file mode 100644 index 000000000..2e06dd01b Binary files /dev/null and b/res/drawable/ic_cab_done_holo_dark.png differ diff --git a/res/layout/applistitem.xml b/res/layout/applistitem.xml index f2f11e132..ebc9c5367 100644 --- a/res/layout/applistitem.xml +++ b/res/layout/applistitem.xml @@ -14,6 +14,26 @@ android:layout_height="50dp" android:padding="4dp"/> + + + + + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 24e579438..3bf3b9d12 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -177,6 +177,6 @@ Display a list of permissions an app needs You don\'t have any app installed that can handle %s Compact Layout - Hide app summaries when listing apps + Only show app names and summaries in list diff --git a/src/org/fdroid/fdroid/AppListAdapter.java b/src/org/fdroid/fdroid/AppListAdapter.java deleted file mode 100644 index 7d1f45168..000000000 --- a/src/org/fdroid/fdroid/AppListAdapter.java +++ /dev/null @@ -1,112 +0,0 @@ -package org.fdroid.fdroid; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import android.content.Context; -import android.net.Uri; -import android.preference.PreferenceManager; -import android.content.SharedPreferences; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.ImageView; -import android.widget.TextView; - -public class AppListAdapter extends BaseAdapter { - - private List items = new ArrayList(); - private Context mContext; - - private boolean pref_compact; - - public AppListAdapter(Context context) { - mContext = context; - SharedPreferences prefs = PreferenceManager - .getDefaultSharedPreferences(mContext); - pref_compact = prefs.getBoolean("compactlayout", false); - } - - public void addItem(DB.App app) { - items.add(app); - } - - public void clear() { - items.clear(); - } - - @Override - public int getCount() { - return items.size(); - } - - @Override - public Object getItem(int position) { - return items.get(position); - } - - @Override - public long getItemId(int position) { - return position; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - View v = convertView; - if (v == null) { - LayoutInflater vi = (LayoutInflater) mContext - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - v = vi.inflate(R.layout.applistitem, null); - } - DB.App app = items.get(position); - - TextView name = (TextView) v.findViewById(R.id.name); - name.setText(app.name); - - String vs; - if (app.hasUpdates) - vs = app.installedVersion + " -> " + app.updateVersion; - else if (app.installedVersion != null) - vs = app.installedVersion; - else { - int numav = app.apks.size(); - if (numav == 1) - vs = mContext.getString(R.string.n_version_available); - else - vs = mContext.getString(R.string.n_versions_available); - vs = String.format(vs, numav); - } - - TextView status = (TextView) v.findViewById(R.id.status); - status.setText(vs); - - TextView license = (TextView) v.findViewById(R.id.license); - license.setText(app.license); - - TextView summary = (TextView) v.findViewById(R.id.summary); - if (pref_compact) - summary.setVisibility(View.GONE); - else - summary.setText(app.summary); - - ImageView icon = (ImageView) v.findViewById(R.id.icon); - File icn = new File(DB.getIconsPath(), app.icon); - if (icn.exists() && icn.length() > 0) { - new Uri.Builder().build(); - icon.setImageURI(Uri.parse(icn.getPath())); - } else { - icon.setImageResource(android.R.drawable.sym_def_app_icon); - } - - // Disable it all if it isn't compatible... - View[] views = { v, status, summary, license, name }; - for (View view : views) { - view.setEnabled(app.compatible); - } - - return v; - } - -} diff --git a/src/org/fdroid/fdroid/AppListManager.java b/src/org/fdroid/fdroid/AppListManager.java index eadb2a476..4b2b5a077 100644 --- a/src/org/fdroid/fdroid/AppListManager.java +++ b/src/org/fdroid/fdroid/AppListManager.java @@ -4,6 +4,10 @@ import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.util.Log; import android.widget.ArrayAdapter; +import org.fdroid.fdroid.views.AppListAdapter; +import org.fdroid.fdroid.views.AvailableAppListAdapter; +import org.fdroid.fdroid.views.CanUpdateAppListAdapter; +import org.fdroid.fdroid.views.InstalledAppListAdapter; import java.util.*; @@ -48,9 +52,9 @@ public class AppListManager { public AppListManager(FDroid activity) { this.fdroidActivity = activity; - availableApps = new AppListAdapter(fdroidActivity); - installedApps = new AppListAdapter(fdroidActivity); - canUpgradeApps = new AppListAdapter(fdroidActivity); + availableApps = new AvailableAppListAdapter(fdroidActivity); + installedApps = new InstalledAppListAdapter(fdroidActivity); + canUpgradeApps = new CanUpdateAppListAdapter(fdroidActivity); // Needs to be created before createViews(), because that will use the // getCategoriesAdapter() accessor which expects this object... diff --git a/src/org/fdroid/fdroid/SearchResults.java b/src/org/fdroid/fdroid/SearchResults.java index 18631b1d7..95c2434e9 100644 --- a/src/org/fdroid/fdroid/SearchResults.java +++ b/src/org/fdroid/fdroid/SearchResults.java @@ -31,6 +31,8 @@ import android.view.MenuItem; import android.view.View; import android.widget.ListView; import android.widget.TextView; +import org.fdroid.fdroid.views.AppListAdapter; +import org.fdroid.fdroid.views.AvailableAppListAdapter; public class SearchResults extends ListActivity { @@ -45,7 +47,7 @@ public class SearchResults extends ListActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - applist = new AppListAdapter(this); + applist = new AvailableAppListAdapter(this); setContentView(R.layout.searchresults); Intent intent = getIntent(); diff --git a/src/org/fdroid/fdroid/views/AppListAdapter.java b/src/org/fdroid/fdroid/views/AppListAdapter.java new file mode 100644 index 000000000..2521dddc6 --- /dev/null +++ b/src/org/fdroid/fdroid/views/AppListAdapter.java @@ -0,0 +1,155 @@ +package org.fdroid.fdroid.views; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import android.content.Context; +import android.net.Uri; +import android.preference.PreferenceManager; +import android.content.SharedPreferences; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.*; +import org.fdroid.fdroid.DB; +import org.fdroid.fdroid.R; + +abstract public class AppListAdapter extends BaseAdapter { + + private List items = new ArrayList(); + private Context mContext; + + private boolean pref_compact; + + public AppListAdapter(Context context) { + mContext = context; + SharedPreferences prefs = PreferenceManager + .getDefaultSharedPreferences(mContext); + pref_compact = prefs.getBoolean("compactlayout", false); + } + + abstract protected boolean showStatusUpdate(); + + abstract protected boolean showStatusInstalled(); + + public void addItem(DB.App app) { + items.add(app); + } + + public void clear() { + items.clear(); + } + + @Override + public int getCount() { + return items.size(); + } + + @Override + public Object getItem(int position) { + return items.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + View v = convertView; + if (v == null) { + LayoutInflater vi = (LayoutInflater) mContext + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + v = vi.inflate(R.layout.applistitem, null); + } + DB.App app = items.get(position); + + TextView name = (TextView) v.findViewById(R.id.name); + name.setText(app.name); + + TextView summary = (TextView) v.findViewById(R.id.summary); + summary.setText(app.summary); + + TextView status = (TextView) v.findViewById(R.id.status); + TextView license = (TextView) v.findViewById(R.id.license); + + ImageView iconUpdates = (ImageView)v.findViewById(R.id.icon_status_has_updates); + ImageView iconInstalled = (ImageView)v.findViewById(R.id.icon_status_installed); + + if (pref_compact) { + + status.setVisibility(View.GONE); + license.setVisibility(View.GONE); + + RelativeLayout.LayoutParams summaryLayout = + new RelativeLayout.LayoutParams( + RelativeLayout.LayoutParams.WRAP_CONTENT, + RelativeLayout.LayoutParams.WRAP_CONTENT); + summaryLayout.addRule(RelativeLayout.BELOW, R.id.name); + summaryLayout.addRule(RelativeLayout.RIGHT_OF, R.id.icon); + summary.setLayoutParams(summaryLayout); + + if (app.hasUpdates && showStatusUpdate()) { + iconUpdates.setImageResource(R.drawable.ic_menu_refresh); + iconUpdates.setVisibility(View.VISIBLE); + } else { + iconUpdates.setVisibility(View.GONE); + } + + if (app.installedVerCode > 0 && showStatusInstalled()) { + iconInstalled.setImageResource(R.drawable.ic_cab_done_holo_dark); + iconInstalled.setVisibility(View.VISIBLE); + } else { + iconInstalled.setVisibility(View.GONE); + } + + } else { + + status.setText(getVersionInfo(app)); + license.setText(app.license); + + iconUpdates.setVisibility(View.GONE); + iconInstalled.setVisibility(View.GONE); + } + + ImageView icon = (ImageView) v.findViewById(R.id.icon); + File icn = new File(DB.getIconsPath(), app.icon); + if (icn.exists() && icn.length() > 0) { + new Uri.Builder().build(); + icon.setImageURI(Uri.parse(icn.getPath())); + } else { + icon.setImageResource(android.R.drawable.sym_def_app_icon); + } + + // Disable it all if it isn't compatible... + View[] views = { v, status, summary, license, name }; + for (View view : views) { + view.setEnabled(app.compatible); + } + + return v; + } + + private String getVersionInfo(DB.App app) { + StringBuilder version = new StringBuilder(); + if (app.installedVersion != null) { + version.append(app.installedVersion); + if (app.hasUpdates) { + version.append(" -> "); + version.append(app.updateVersion); + } + } else { + int numav = app.apks.size(); + String numVersions; + if (numav == 1) + numVersions = mContext.getString(R.string.n_version_available); + else + numVersions = mContext.getString(R.string.n_versions_available); + version.append(String.format(numVersions, numav)); + } + return version.toString(); + } + +} diff --git a/src/org/fdroid/fdroid/views/AvailableAppListAdapter.java b/src/org/fdroid/fdroid/views/AvailableAppListAdapter.java new file mode 100644 index 000000000..2b74b2d88 --- /dev/null +++ b/src/org/fdroid/fdroid/views/AvailableAppListAdapter.java @@ -0,0 +1,19 @@ +package org.fdroid.fdroid.views; + +import android.content.Context; + +public class AvailableAppListAdapter extends AppListAdapter { + public AvailableAppListAdapter(Context context) { + super(context); + } + + @Override + protected boolean showStatusUpdate() { + return true; + } + + @Override + protected boolean showStatusInstalled() { + return true; + } +} diff --git a/src/org/fdroid/fdroid/views/CanUpdateAppListAdapter.java b/src/org/fdroid/fdroid/views/CanUpdateAppListAdapter.java new file mode 100644 index 000000000..efd4416ea --- /dev/null +++ b/src/org/fdroid/fdroid/views/CanUpdateAppListAdapter.java @@ -0,0 +1,19 @@ +package org.fdroid.fdroid.views; + +import android.content.Context; + +public class CanUpdateAppListAdapter extends AppListAdapter { + public CanUpdateAppListAdapter(Context context) { + super(context); + } + + @Override + protected boolean showStatusUpdate() { + return false; + } + + @Override + protected boolean showStatusInstalled() { + return false; + } +} diff --git a/src/org/fdroid/fdroid/views/InstalledAppListAdapter.java b/src/org/fdroid/fdroid/views/InstalledAppListAdapter.java new file mode 100644 index 000000000..bb3138e2d --- /dev/null +++ b/src/org/fdroid/fdroid/views/InstalledAppListAdapter.java @@ -0,0 +1,19 @@ +package org.fdroid.fdroid.views; + +import android.content.Context; + +public class InstalledAppListAdapter extends AppListAdapter { + public InstalledAppListAdapter(Context context) { + super(context); + } + + @Override + protected boolean showStatusUpdate() { + return true; + } + + @Override + protected boolean showStatusInstalled() { + return false; + } +} diff --git a/src/org/fdroid/fdroid/views/fragments/AppListFragment.java b/src/org/fdroid/fdroid/views/fragments/AppListFragment.java index e5728221e..249b2f438 100644 --- a/src/org/fdroid/fdroid/views/fragments/AppListFragment.java +++ b/src/org/fdroid/fdroid/views/fragments/AppListFragment.java @@ -8,6 +8,7 @@ import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ListView; import org.fdroid.fdroid.*; +import org.fdroid.fdroid.views.AppListAdapter; import org.fdroid.fdroid.views.AppListView; abstract class AppListFragment extends Fragment implements AdapterView.OnItemClickListener { diff --git a/src/org/fdroid/fdroid/views/fragments/AvailableAppsFragment.java b/src/org/fdroid/fdroid/views/fragments/AvailableAppsFragment.java index c5955efc4..541267ae3 100644 --- a/src/org/fdroid/fdroid/views/fragments/AvailableAppsFragment.java +++ b/src/org/fdroid/fdroid/views/fragments/AvailableAppsFragment.java @@ -6,7 +6,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.*; -import org.fdroid.fdroid.AppListAdapter; +import org.fdroid.fdroid.views.AppListAdapter; import org.fdroid.fdroid.R; import org.fdroid.fdroid.views.AppListView; diff --git a/src/org/fdroid/fdroid/views/fragments/CanUpdateAppsFragment.java b/src/org/fdroid/fdroid/views/fragments/CanUpdateAppsFragment.java index 2b864aadd..9485b478b 100644 --- a/src/org/fdroid/fdroid/views/fragments/CanUpdateAppsFragment.java +++ b/src/org/fdroid/fdroid/views/fragments/CanUpdateAppsFragment.java @@ -4,8 +4,7 @@ import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.AdapterView; -import org.fdroid.fdroid.AppListAdapter; +import org.fdroid.fdroid.views.AppListAdapter; public class CanUpdateAppsFragment extends AppListFragment { diff --git a/src/org/fdroid/fdroid/views/fragments/InstalledAppsFragment.java b/src/org/fdroid/fdroid/views/fragments/InstalledAppsFragment.java index 628ddf9b4..8bcc6b462 100644 --- a/src/org/fdroid/fdroid/views/fragments/InstalledAppsFragment.java +++ b/src/org/fdroid/fdroid/views/fragments/InstalledAppsFragment.java @@ -4,7 +4,7 @@ import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import org.fdroid.fdroid.AppListAdapter; +import org.fdroid.fdroid.views.AppListAdapter; public class InstalledAppsFragment extends AppListFragment {