import android.os.UserManager;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.WindowManager;
-import android.widget.ListView;
import android.widget.ProgressBar;
import com.farmerbb.taskbar.R;
private DesktopIconAppListGenerator appListGenerator;
private ProgressBar progressBar;
- private ListView appList;
+ private RecyclerView appList;
private DesktopIconInfo desktopIcon;
entries.add(entry);
}
- return new DesktopIconAppListAdapter(DesktopIconSelectAppActivity.this, R.layout.tb_desktop_icon_row, entries);
+ return new DesktopIconAppListAdapter(DesktopIconSelectAppActivity.this, entries);
}
@Override
protected void onPostExecute(DesktopIconAppListAdapter adapter) {
progressBar.setVisibility(View.GONE);
+ appList.setLayoutManager(new LinearLayoutManager(DesktopIconSelectAppActivity.this));
appList.setAdapter(adapter);
setFinishOnTouchOutside(true);
}
package com.farmerbb.taskbar.activity;
import android.content.ActivityNotFoundException;
-import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
-import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
-import com.farmerbb.taskbar.BuildConfig;
import com.farmerbb.taskbar.R;
import com.farmerbb.taskbar.util.IconPack;
import com.farmerbb.taskbar.util.IconPackManager;
private AppListGenerator appListGenerator;
private ProgressBar progressBar;
- private ListView appList;
+ private RecyclerView appList;
@Override
protected void onCreate(Bundle savedInstanceState) {
} catch (ActivityNotFoundException e) { /* Gracefully fail */ }
}
- private class AppListAdapter extends ArrayAdapter<IconPack> {
- AppListAdapter(Context context, int layout, List<IconPack> list) {
- super(context, layout, list);
+ private class AppListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+
+ private List<IconPack> entries = new ArrayList<>();
+
+ AppListAdapter(List<IconPack> list) {
+ entries.addAll(list);
}
+ @NonNull
@Override
- public @NonNull View getView(int position, View convertView, final @NonNull ViewGroup parent) {
- // Check if an existing view is being reused, otherwise inflate the view
- if(convertView == null)
- convertView = LayoutInflater.from(getContext()).inflate(R.layout.tb_row, parent, false);
+ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
+ View view = LayoutInflater.from(IconPackActivity.this).inflate(R.layout.tb_desktop_icon_row, viewGroup, false);
+ return new RecyclerView.ViewHolder(view) {};
+ }
- final IconPack entry = getItem(position);
+ @Override
+ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
+ final IconPack entry = entries.get(i);
assert entry != null;
- TextView textView = convertView.findViewById(R.id.name);
+ TextView textView = viewHolder.itemView.findViewById(R.id.name);
textView.setText(entry.getName());
PackageManager pm = getPackageManager();
- ImageView imageView = convertView.findViewById(R.id.icon);
+ ImageView imageView = viewHolder.itemView.findViewById(R.id.icon);
if(entry.getPackageName().equals(getPackageName())) {
imageView.setImageDrawable(null);
}
}
- LinearLayout layout = convertView.findViewById(R.id.entry);
+ LinearLayout layout = viewHolder.itemView.findViewById(R.id.entry);
layout.setOnClickListener(view -> {
SharedPreferences pref = U.getSharedPreferences(IconPackActivity.this);
pref.edit().putString("icon_pack", entry.getPackageName()).apply();
}
return false;
});
+ }
- return convertView;
+ @Override
+ public int getItemCount() {
+ return entries.size();
}
}
finalList.add(dummyIconPack);
finalList.addAll(list);
- return new AppListAdapter(IconPackActivity.this, R.layout.tb_row, finalList);
+ return new AppListAdapter(finalList);
}
}
finish();
} else {
progressBar.setVisibility(View.GONE);
+ appList.setLayoutManager(new LinearLayoutManager(IconPackActivity.this));
appList.setAdapter(adapter);
setFinishOnTouchOutside(true);
}
}
return new AppListAdapter[] {
- new AppListAdapter(SelectAppActivity.this, R.layout.tb_row_blacklist, entries, U.HIDDEN),
- new AppListAdapter(SelectAppActivity.this, R.layout.tb_row_blacklist, entries, U.TOP_APPS)
+ new AppListAdapter(SelectAppActivity.this, entries, U.HIDDEN),
+ new AppListAdapter(SelectAppActivity.this, entries, U.TOP_APPS)
};
}
import android.content.Context;
import android.support.annotation.NonNull;
+import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.farmerbb.taskbar.util.TopApps;
import com.farmerbb.taskbar.util.U;
+import java.util.ArrayList;
import java.util.List;
-public class AppListAdapter extends ArrayAdapter<BlacklistEntry> {
- private final Blacklist blacklist = Blacklist.getInstance(getContext());
- private final TopApps topApps = TopApps.getInstance(getContext());
+public class AppListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+ private final Blacklist blacklist;
+ private final TopApps topApps;
+ private Context context;
+ private List<BlacklistEntry> entries = new ArrayList<>();
private int type;
- public AppListAdapter(Context context, int layout, List<BlacklistEntry> list, int type) {
- super(context, layout, list);
-
+ public AppListAdapter(Context context, List<BlacklistEntry> list, int type) {
+ this.context = context;
+ entries.addAll(list);
this.type = type;
+
+ blacklist = Blacklist.getInstance(context);
+ topApps = TopApps.getInstance(context);
}
+ @NonNull
@Override
- public @NonNull View getView(int position, View convertView, final @NonNull ViewGroup parent) {
- // Check if an existing view is being reused, otherwise inflate the view
- if(convertView == null)
- convertView = LayoutInflater.from(getContext()).inflate(R.layout.tb_row_blacklist, parent, false);
+ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
+ View view = LayoutInflater.from(context).inflate(R.layout.tb_row_blacklist, viewGroup, false);
+ return new RecyclerView.ViewHolder(view) {};
+ }
+ @Override
+ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
switch(type) {
case U.HIDDEN:
- setupHidden(position, convertView);
+ setupHidden(i, viewHolder.itemView);
break;
case U.TOP_APPS:
- setupTopApps(position, convertView);
+ setupTopApps(i, viewHolder.itemView);
break;
}
+ }
- return convertView;
+ @Override
+ public int getItemCount() {
+ return entries.size();
}
private void setupHidden(int position, View convertView) {
- final BlacklistEntry entry = getItem(position);
+ final BlacklistEntry entry = entries.get(position);
assert entry != null;
final String componentName = entry.getPackageName();
if(topApps.isTopApp(componentName)
|| topApps.isTopApp(componentNameAlt)
|| topApps.isTopApp(componentNameAlt2)) {
- U.showToast(getContext(),
- getContext().getString(R.string.tb_already_top_app, entry.getLabel()),
+ U.showToast(context,
+ context.getString(R.string.tb_already_top_app, entry.getLabel()),
Toast.LENGTH_LONG);
} else if(blacklist.isBlocked(componentName)) {
- blacklist.removeBlockedApp(getContext(), componentName);
+ blacklist.removeBlockedApp(context, componentName);
checkBox.setChecked(false);
} else if(blacklist.isBlocked(componentNameAlt)) {
- blacklist.removeBlockedApp(getContext(), componentNameAlt);
+ blacklist.removeBlockedApp(context, componentNameAlt);
checkBox.setChecked(false);
} else if(blacklist.isBlocked(componentNameAlt2)) {
- blacklist.removeBlockedApp(getContext(), componentNameAlt2);
+ blacklist.removeBlockedApp(context, componentNameAlt2);
checkBox.setChecked(false);
} else {
- blacklist.addBlockedApp(getContext(), entry);
+ blacklist.addBlockedApp(context, entry);
checkBox.setChecked(true);
}
});
}
private void setupTopApps(int position, View convertView) {
- final BlacklistEntry entry = getItem(position);
+ final BlacklistEntry entry = entries.get(position);
assert entry != null;
final String componentName = entry.getPackageName();
if(blacklist.isBlocked(componentName)
|| blacklist.isBlocked(componentNameAlt)
|| blacklist.isBlocked(componentNameAlt2)) {
- U.showToast(getContext(),
- getContext().getString(R.string.tb_already_blacklisted, entry.getLabel()),
+ U.showToast(context,
+ context.getString(R.string.tb_already_blacklisted, entry.getLabel()),
Toast.LENGTH_LONG);
} else if(topApps.isTopApp(componentName)) {
- topApps.removeTopApp(getContext(), componentName);
+ topApps.removeTopApp(context, componentName);
checkBox.setChecked(false);
} else if(topApps.isTopApp(componentNameAlt)) {
- topApps.removeTopApp(getContext(), componentNameAlt);
+ topApps.removeTopApp(context, componentNameAlt);
checkBox.setChecked(false);
} else if(topApps.isTopApp(componentNameAlt2)) {
- topApps.removeTopApp(getContext(), componentNameAlt2);
+ topApps.removeTopApp(context, componentNameAlt2);
checkBox.setChecked(false);
} else {
- topApps.addTopApp(getContext(), entry);
+ topApps.addTopApp(context, entry);
checkBox.setChecked(true);
}
});
package com.farmerbb.taskbar.adapter;
import android.content.Context;
+import android.support.annotation.NonNull;
+import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.farmerbb.taskbar.activity.DesktopIconSelectAppActivity;
import com.farmerbb.taskbar.util.AppEntry;
+import java.util.ArrayList;
import java.util.List;
-public class DesktopIconAppListAdapter extends ArrayAdapter<AppEntry> {
- public DesktopIconAppListAdapter(Context context, int layout, List<AppEntry> list) {
- super(context, layout, list);
+public class DesktopIconAppListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+
+ private Context context;
+ private List<AppEntry> entries = new ArrayList<>();
+
+ public DesktopIconAppListAdapter(Context context, List<AppEntry> list) {
+ this.context = context;
+ entries.addAll(list);
}
+ @NonNull
@Override
- public View getView(int position, View convertView, final ViewGroup parent) {
- // Check if an existing view is being reused, otherwise inflate the view
- if(convertView == null)
- convertView = LayoutInflater.from(getContext()).inflate(R.layout.tb_desktop_icon_row, parent, false);
+ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
+ View view = LayoutInflater.from(context).inflate(R.layout.tb_desktop_icon_row, viewGroup, false);
+ return new RecyclerView.ViewHolder(view) {};
+ }
- final AppEntry entry = getItem(position);
+ @Override
+ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
+ final AppEntry entry = entries.get(i);
assert entry != null;
- TextView textView = convertView.findViewById(R.id.name);
+ TextView textView = viewHolder.itemView.findViewById(R.id.name);
textView.setText(entry.getLabel());
- ImageView imageView = convertView.findViewById(R.id.icon);
- imageView.setImageDrawable(entry.getIcon(getContext()));
+ ImageView imageView = viewHolder.itemView.findViewById(R.id.icon);
+ imageView.setImageDrawable(entry.getIcon(context));
- LinearLayout layout = convertView.findViewById(R.id.entry);
+ LinearLayout layout = viewHolder.itemView.findViewById(R.id.entry);
layout.setOnClickListener(view -> {
- DesktopIconSelectAppActivity activity = (DesktopIconSelectAppActivity) getContext();
+ DesktopIconSelectAppActivity activity = (DesktopIconSelectAppActivity) context;
activity.selectApp(entry);
});
+ }
- return convertView;
+ @Override
+ public int getItemCount() {
+ return entries.size();
}
}
\ No newline at end of file
import android.os.Bundle;
import android.support.v4.app.Fragment;
+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 com.farmerbb.taskbar.R;
import com.farmerbb.taskbar.activity.SelectAppActivity;
public class SelectAppFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
SelectAppActivity activity = (SelectAppActivity) getActivity();
- ListView appList = new ListView(activity);
+ RecyclerView appList = (RecyclerView) inflater.inflate(R.layout.tb_recyclerview, container, false);
int type = getArguments().getInt(ARG_SECTION_NUMBER);
+ appList.setLayoutManager(new LinearLayoutManager(getActivity()));
appList.setAdapter(activity.getAppListAdapter(type));
return appList;
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/entry"
android:layout_height="wrap_content"
- android:layout_width="match_parent"
+ android:layout_width="320dp"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:background="?attr/selectableItemBackground" >
android:layout_marginBottom="48dp"\r
android:layout_gravity="center" />\r
\r
- <ListView\r
+ <android.support.v7.widget.RecyclerView\r
android:id="@+id/list"\r
android:layout_width="match_parent"\r
- android:layout_height="match_parent" />\r
+ android:layout_height="match_parent"\r
+ android:scrollbars="vertical" />\r
\r
</FrameLayout>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2019 Braden Farmer
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<android.support.v7.widget.RecyclerView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:scrollbars="vertical" />
\ No newline at end of file
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/entry"
android:layout_height="wrap_content"
- android:layout_width="match_parent"
+ android:layout_width="320dp"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:paddingTop="4dp"
android:layout_marginBottom="44dp"
android:layout_gravity="center" />
- <ListView
+ <android.support.v7.widget.RecyclerView
android:id="@+id/list"
android:layout_width="match_parent"
- android:layout_height="match_parent" />
+ android:layout_height="match_parent"
+ android:scrollbars="vertical" />
</FrameLayout>
\ No newline at end of file