diff --git a/build.gradle b/build.gradle index 09872cf4e..0638d284e 100644 --- a/build.gradle +++ b/build.gradle @@ -91,6 +91,7 @@ dependencies { compile "com.android.support:support-v4:25.1.1" compile "com.android.support:support-v13:25.1.1" + compile "com.android.support:recyclerview-v7:25.1.1" compile 'com.android.support:appcompat-v7:25.1.1' compile "com.github.dmytrodanylyk.android-process-button:library:1.0.4" compile "com.jakewharton.byteunits:byteunits:0.9.1" diff --git a/src/main/java/org/amahi/anywhere/adapter/ServerAppsAdapter.java b/src/main/java/org/amahi/anywhere/adapter/ServerAppsAdapter.java index d7881e4c8..c0ad8e23d 100644 --- a/src/main/java/org/amahi/anywhere/adapter/ServerAppsAdapter.java +++ b/src/main/java/org/amahi/anywhere/adapter/ServerAppsAdapter.java @@ -20,6 +20,7 @@ package org.amahi.anywhere.adapter; import android.content.Context; +import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; @@ -31,6 +32,8 @@ import com.squareup.picasso.Picasso; import org.amahi.anywhere.R; +import org.amahi.anywhere.bus.AppSelectedEvent; +import org.amahi.anywhere.bus.BusProvider; import org.amahi.anywhere.server.model.ServerApp; import java.util.Collections; @@ -40,34 +43,68 @@ * Apps adapter. Visualizes web apps * for the {@link org.amahi.anywhere.fragment.ServerAppsFragment}. */ -public class ServerAppsAdapter extends BaseAdapter +public class ServerAppsAdapter extends RecyclerView.Adapter { - private final LayoutInflater layoutInflater; - private List apps; + private Context mContext; public ServerAppsAdapter(Context context) { - this.layoutInflater = LayoutInflater.from(context); - + mContext = context; this.apps = Collections.emptyList(); } - public void replaceWith(List apps) { - this.apps = apps; + class ServerAppsViewHolder extends RecyclerView.ViewHolder{ + TextView text; + ImageView logo; + ServerAppsViewHolder(View itemView) { + super(itemView); + text = (TextView)itemView.findViewById(R.id.text); + logo = (ImageView)itemView.findViewById(R.id.logo); + } + } - notifyDataSetChanged(); + @Override + public ServerAppsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + return new ServerAppsViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.view_server_app_item, parent, false)); + } + + @Override + public void onBindViewHolder(final ServerAppsViewHolder holder, int position) { + holder.text.setText(apps.get(position).getName()); + if(TextUtils.isEmpty(apps.get(position).getLogoUrl())) + holder.logo.setImageResource(R.drawable.ic_app_logo); + else { + Picasso + .with(mContext) + .load(apps.get(position).getLogoUrl()) + .fit() + .centerInside() + .error(R.drawable.ic_app_logo) + .into(holder.logo); + } + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + BusProvider.getBus().post(new AppSelectedEvent(apps.get(holder.getAdapterPosition()))); + } + }); } @Override - public int getCount() { + public int getItemCount() { return apps.size(); } + public void replaceWith(List apps) { + this.apps = apps; + + notifyDataSetChanged(); + } + public List getItems() { return apps; } - @Override public ServerApp getItem(int position) { return apps.get(position); } @@ -76,40 +113,4 @@ public ServerApp getItem(int position) { public long getItemId(int position) { return position; } - - @Override - public View getView(int position, View view, ViewGroup container) { - ServerApp app = getItem(position); - - if (view == null) { - view = newView(container); - } - - bindView(app, view); - - return view; - } - - private View newView(ViewGroup container) { - return layoutInflater.inflate(R.layout.view_server_app_item, container, false); - } - - private void bindView(ServerApp app, View view) { - ImageView appLogoView = (ImageView) view.findViewById(R.id.logo); - TextView appTextView = (TextView) view.findViewById(R.id.text); - - if (TextUtils.isEmpty(app.getLogoUrl())) { - appLogoView.setImageResource(R.drawable.ic_app_logo); - } else { - Picasso - .with(view.getContext()) - .load(app.getLogoUrl()) - .fit() - .centerInside() - .error(R.drawable.ic_app_logo) - .into(appLogoView); - } - - appTextView.setText(app.getName()); - } } diff --git a/src/main/java/org/amahi/anywhere/adapter/ServerSharesAdapter.java b/src/main/java/org/amahi/anywhere/adapter/ServerSharesAdapter.java index 4c001fead..d7d172594 100644 --- a/src/main/java/org/amahi/anywhere/adapter/ServerSharesAdapter.java +++ b/src/main/java/org/amahi/anywhere/adapter/ServerSharesAdapter.java @@ -20,6 +20,7 @@ package org.amahi.anywhere.adapter; import android.content.Context; +import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -27,6 +28,8 @@ import android.widget.TextView; import org.amahi.anywhere.R; +import org.amahi.anywhere.bus.BusProvider; +import org.amahi.anywhere.bus.ShareSelectedEvent; import org.amahi.anywhere.server.model.ServerShare; import java.util.Collections; @@ -36,15 +39,40 @@ * Shares adapter. Visualizes shares * for the {@link org.amahi.anywhere.fragment.ServerSharesFragment}. */ -public class ServerSharesAdapter extends BaseAdapter +public class ServerSharesAdapter extends RecyclerView.Adapter { - private final LayoutInflater layoutInflater; - private List shares; - public ServerSharesAdapter(Context context) { - this.layoutInflater = LayoutInflater.from(context); + class ServerShareViewHolder extends RecyclerView.ViewHolder{ + TextView textView; + ServerShareViewHolder(View itemView) { + super(itemView); + textView = (TextView)itemView.findViewById(R.id.text); + } + } + @Override + public ServerShareViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + return new ServerShareViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.view_server_share_item, parent, false)); + } + + @Override + public void onBindViewHolder(final ServerShareViewHolder holder, int position) { + holder.textView.setText(shares.get(position).getName()); + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + BusProvider.getBus().post(new ShareSelectedEvent(shares.get(holder.getAdapterPosition()))); + } + }); + } + + @Override + public int getItemCount() { + return shares.size(); + } + + public ServerSharesAdapter(Context context) { this.shares = Collections.emptyList(); } @@ -54,16 +82,10 @@ public void replaceWith(List shares) { notifyDataSetChanged(); } - @Override - public int getCount() { - return shares.size(); - } - public List getItems() { return shares; } - @Override public ServerShare getItem(int position) { return shares.get(position); } @@ -72,31 +94,4 @@ public ServerShare getItem(int position) { public long getItemId(int position) { return position; } - - @Override - public View getView(int position, View view, ViewGroup container) { - ServerShare share = getItem(position); - - if (view == null) { - view = newView(container); - } - - bindView(share, view); - - return view; - } - - private View newView(ViewGroup container) { - return layoutInflater.inflate(R.layout.view_server_share_item, container, false); - } - - private void bindView(ServerShare share, View view) { - TextView shareView = (TextView) view; - - shareView.setText(getShareName(share)); - } - - private String getShareName(ServerShare share) { - return share.getName(); - } } diff --git a/src/main/java/org/amahi/anywhere/fragment/ServerAppsFragment.java b/src/main/java/org/amahi/anywhere/fragment/ServerAppsFragment.java index 8465eec24..f55af8578 100644 --- a/src/main/java/org/amahi/anywhere/fragment/ServerAppsFragment.java +++ b/src/main/java/org/amahi/anywhere/fragment/ServerAppsFragment.java @@ -19,20 +19,22 @@ package org.amahi.anywhere.fragment; -import android.app.ListFragment; +import android.app.Fragment; import android.os.Bundle; import android.os.Parcelable; +import android.support.v7.widget.DividerItemDecoration; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.ListView; +import android.widget.LinearLayout; import com.squareup.otto.Subscribe; import org.amahi.anywhere.AmahiApplication; import org.amahi.anywhere.R; import org.amahi.anywhere.adapter.ServerAppsAdapter; -import org.amahi.anywhere.bus.AppSelectedEvent; import org.amahi.anywhere.bus.BusProvider; import org.amahi.anywhere.bus.ServerAppsLoadFailedEvent; import org.amahi.anywhere.bus.ServerAppsLoadedEvent; @@ -49,7 +51,7 @@ /** * Apps fragment. Shows apps list. */ -public class ServerAppsFragment extends ListFragment +public class ServerAppsFragment extends Fragment { private static final class State { @@ -59,12 +61,31 @@ private State() { public static final String APPS = "apps"; } + private ServerAppsAdapter mServerAppsAdapter; + + private RecyclerView mRecyclerView; + + private LinearLayout mEmptyLinearLayout; + @Inject ServerClient serverClient; @Override public View onCreateView(LayoutInflater layoutInflater, ViewGroup container, Bundle savedInstanceState) { - return layoutInflater.inflate(R.layout.fragment_server_apps, container, false); + View rootView = layoutInflater.inflate(R.layout.fragment_server_apps, container, false); + + mRecyclerView = (RecyclerView)rootView.findViewById(R.id.list_server_apps); + + mServerAppsAdapter = new ServerAppsAdapter(getActivity()); + + mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(),LinearLayoutManager.VERTICAL,false)); + + mEmptyLinearLayout = (LinearLayout)rootView.findViewById(R.id.empty_server_apps); + + mRecyclerView.addItemDecoration(new + DividerItemDecoration(getActivity(), + DividerItemDecoration.VERTICAL)); + return rootView; } @Override @@ -86,7 +107,7 @@ private void setUpApps(Bundle state) { } private void setUpAppsAdapter() { - setListAdapter(new ServerAppsAdapter(getActivity())); + mRecyclerView.setAdapter(mServerAppsAdapter); } private void setUpAppsContent(Bundle state) { @@ -103,10 +124,15 @@ private boolean isAppsStateValid(Bundle state) { private void setUpAppsState(Bundle state) { List apps = state.getParcelableArrayList(State.APPS); + if(apps!=null) { + mEmptyLinearLayout.setVisibility(View.GONE); + setUpAppsContent(apps); - setUpAppsContent(apps); - - showAppsContent(); + showAppsContent(); + } + else{ + mEmptyLinearLayout.setVisibility(View.VISIBLE); + } } private void setUpAppsContent(List apps) { @@ -114,7 +140,7 @@ private void setUpAppsContent(List apps) { } private ServerAppsAdapter getAppsAdapter() { - return (ServerAppsAdapter) getListAdapter(); + return mServerAppsAdapter; } private void showAppsContent() { @@ -148,17 +174,6 @@ private void showAppsError() { ViewDirector.of(this, R.id.animator).show(R.id.error); } - @Override - public void onListItemClick(ListView appsListView, View appView, int appPosition, long appId) { - super.onListItemClick(appsListView, appView, appPosition, appId); - - startAppOpening(getAppsAdapter().getItem(appPosition)); - } - - private void startAppOpening(ServerApp app) { - BusProvider.getBus().post(new AppSelectedEvent(app)); - } - @Override public void onResume() { super.onResume(); diff --git a/src/main/java/org/amahi/anywhere/fragment/ServerSharesFragment.java b/src/main/java/org/amahi/anywhere/fragment/ServerSharesFragment.java index e11585603..c4cc4c76b 100644 --- a/src/main/java/org/amahi/anywhere/fragment/ServerSharesFragment.java +++ b/src/main/java/org/amahi/anywhere/fragment/ServerSharesFragment.java @@ -19,13 +19,16 @@ package org.amahi.anywhere.fragment; -import android.app.ListFragment; +import android.app.Fragment; import android.os.Bundle; import android.os.Parcelable; +import android.support.v7.widget.DividerItemDecoration; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.ListView; +import android.widget.LinearLayout; import com.squareup.otto.Subscribe; @@ -49,7 +52,7 @@ /** * Shares fragment. Shows shares list. */ -public class ServerSharesFragment extends ListFragment +public class ServerSharesFragment extends Fragment { private static final class State { @@ -59,12 +62,33 @@ private State() { public static final String SHARES = "shares"; } + private RecyclerView mRecyclerView; + + private ServerSharesAdapter mServerSharesAdapter; + + private LinearLayout mEmptyLinearLayout; + @Inject ServerClient serverClient; @Override public View onCreateView(LayoutInflater layoutInflater, ViewGroup container, Bundle savedInstanceState) { - return layoutInflater.inflate(R.layout.fragment_server_shares, container, false); + + View rootView = layoutInflater.inflate(R.layout.fragment_server_shares, container, false); + + mRecyclerView = (RecyclerView)rootView.findViewById(R.id.list); + + mServerSharesAdapter = new ServerSharesAdapter(getActivity()); + + mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(),LinearLayoutManager.VERTICAL,false)); + + mEmptyLinearLayout = (LinearLayout)rootView.findViewById(R.id.empty); + + mRecyclerView.addItemDecoration(new + DividerItemDecoration(getActivity(), + DividerItemDecoration.VERTICAL)); + + return rootView; } @Override @@ -82,11 +106,12 @@ private void setUpInjections() { private void setUpShares(Bundle state) { setUpSharesAdapter(); + setUpSharesContent(state); } private void setUpSharesAdapter() { - setListAdapter(new ServerSharesAdapter(getActivity())); + mRecyclerView.setAdapter(mServerSharesAdapter); } private void setUpSharesContent(Bundle state) { @@ -103,10 +128,18 @@ private boolean isSharesStateValid(Bundle state) { private void setUpSharesState(Bundle state) { List shares = state.getParcelableArrayList(State.SHARES); + if(shares!=null) { + setUpSharesContent(shares); - setUpSharesContent(shares); + showSharesContent(); - showSharesContent(); + mEmptyLinearLayout.setVisibility(View.GONE); + } + else{ + + mEmptyLinearLayout.setVisibility(View.VISIBLE); + + } } private void setUpSharesContent(List shares) { @@ -114,11 +147,11 @@ private void setUpSharesContent(List shares) { } private ServerSharesAdapter getSharesAdapter() { - return (ServerSharesAdapter) getListAdapter(); + return mServerSharesAdapter; } private void showSharesContent() { - ViewDirector.of(this, R.id.animator).show(R.id.content); + ViewDirector.of(getActivity(), R.id.animator).show(R.id.content); } private void setUpSharesContent() { @@ -145,18 +178,7 @@ public void onSharesLoadFailed(ServerSharesLoadFailedEvent event) { } private void showSharesError() { - ViewDirector.of(this, R.id.animator).show(R.id.error); - } - - @Override - public void onListItemClick(ListView sharesListView, View shareView, int sharePosition, long shareId) { - super.onListItemClick(sharesListView, shareView, sharePosition, shareId); - - startShareOpening(getSharesAdapter().getItem(sharePosition)); - } - - private void startShareOpening(ServerShare share) { - BusProvider.getBus().post(new ShareSelectedEvent(share)); + ViewDirector.of(getActivity(), R.id.animator).show(R.id.error); } @Override @@ -189,4 +211,4 @@ private void tearDownSharesState(Bundle state) { private boolean areSharesLoaded() { return getSharesAdapter() != null; } -} +} \ No newline at end of file diff --git a/src/main/res/layout/fragment_server_apps.xml b/src/main/res/layout/fragment_server_apps.xml index a97444a2e..03e1e2e97 100644 --- a/src/main/res/layout/fragment_server_apps.xml +++ b/src/main/res/layout/fragment_server_apps.xml @@ -36,8 +36,8 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - diff --git a/src/main/res/layout/fragment_server_shares.xml b/src/main/res/layout/fragment_server_shares.xml index e38ad0d37..8dfc8c4f5 100644 --- a/src/main/res/layout/fragment_server_shares.xml +++ b/src/main/res/layout/fragment_server_shares.xml @@ -36,8 +36,8 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - diff --git a/src/main/res/layout/view_server_app_item.xml b/src/main/res/layout/view_server_app_item.xml index 23b259a3b..19222cc9f 100644 --- a/src/main/res/layout/view_server_app_item.xml +++ b/src/main/res/layout/view_server_app_item.xml @@ -32,7 +32,7 @@ android:layout_height="40dp"/>