From 1caa7510b68b57db10264cfc0555f2eb39903ff2 Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Mon, 10 Jun 2013 21:37:59 +1000 Subject: [PATCH 1/2] Changed compact view to show description. Removed the license and the version info from the compact view, and showed the description instead. The installed status, and whether the app can be updated or not (but not which version can be updated to) is now shown via little icons on the right hand side of the list view. Also refactored adapters to allow different views for Available/Installed/Updates tabs. This is because I didn't want the "installed" status icon in the installed tab, and neither the "installed" nor the "updates" icon in the "updates" tab. The adapters were moved to the "views" package, because I needed to add three new classes and they started to clutter the list of *.java files. --- res/drawable/ic_cab_done_holo_dark.png | Bin 0 -> 970 bytes res/layout/applistitem.xml | 21 +++ src/org/fdroid/fdroid/AppListAdapter.java | 112 ------------- src/org/fdroid/fdroid/AppListManager.java | 10 +- src/org/fdroid/fdroid/SearchResults.java | 4 +- .../fdroid/fdroid/views/AppListAdapter.java | 155 ++++++++++++++++++ .../fdroid/views/AvailableAppListAdapter.java | 19 +++ .../fdroid/views/CanUpdateAppListAdapter.java | 19 +++ .../fdroid/views/InstalledAppListAdapter.java | 19 +++ .../views/fragments/AppListFragment.java | 1 + .../fragments/AvailableAppsFragment.java | 2 +- .../fragments/CanUpdateAppsFragment.java | 3 +- .../fragments/InstalledAppsFragment.java | 2 +- 13 files changed, 247 insertions(+), 120 deletions(-) create mode 100644 res/drawable/ic_cab_done_holo_dark.png delete mode 100644 src/org/fdroid/fdroid/AppListAdapter.java create mode 100644 src/org/fdroid/fdroid/views/AppListAdapter.java create mode 100644 src/org/fdroid/fdroid/views/AvailableAppListAdapter.java create mode 100644 src/org/fdroid/fdroid/views/CanUpdateAppListAdapter.java create mode 100644 src/org/fdroid/fdroid/views/InstalledAppListAdapter.java 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 0000000000000000000000000000000000000000..2e06dd01be8ccbab90d63cbf47d13e905aed3e20 GIT binary patch literal 970 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;OpT z1B~5HX4`=T%L*LRfwTh{zxwOjfK$EgnR$;T z=N`Kp(hSrM@CU%evd=bf=-4w^bQmnuhmUH-jd<6WZ; zHl4_>Rk2U@t}L_t|AiwlQ891B3C|YS1B^O3M@oxo5*z)LB91b?+QOQX_r0yH)YX2= zvK_aW4}ZVF|MIp0)1X?{@CS{e_APBtKk;H~nV$PVB{N8HV+L1tOj6 z``KDz%d4l`HAyHPxAByb%b6xG^S8m<-YfXS7v>b+zlZNGcwheZcvv-P0dQ7=MviH9v^t)=yc559VF`j43j z_pMt2oAX|`goy_Fm~UMa9d%t_^^2qU)cXl;U0e%IRZSM> z>7Ksk_VioOmKv*1mN|c~ELg&~mMikt+LpAdYoES)QG3#uo404uV`0ytJ&!XS^rKz< zU6j9{ob*(;{k73gyQmwdmG2d+82l2_J(5-Z=Epp_^THpe+eb5HIvzUo?fW(va5{7P zd0GD0trC|9zjsRjleub%YeY#(Vo9o1a#1RfVlXl=G}JY)&^0g*F*LI>FtRc>2C}UT z3_|{Y+l-q7HAsSN2+mI{DNig)WpGT%PfAtr%uP&B Z4N6T+sVqF1Y6Dcn;OXk;vd$@?2>?&0tquSH literal 0 HcmV?d00001 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/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 c0f506109..d2c0f9d93 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 { From 7ef7489c79f3353ac660a75522c9d712d4ced8cc Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Fri, 14 Jun 2013 05:43:27 +1000 Subject: [PATCH 2/2] Updated description of 'Compact Layout' --- res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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