package tw.fatminmin.xposed.minminguard.ui.adapter; import android.content.Context; import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import androidx.core.content.ContextCompat; import androidx.fragment.app.DialogFragment; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.Switch; import android.widget.TextView; import tw.fatminmin.xposed.minminguard.Common; import tw.fatminmin.xposed.minminguard.R; import tw.fatminmin.xposed.minminguard.orm.AppData; import tw.fatminmin.xposed.minminguard.orm.AppDataDao; import tw.fatminmin.xposed.minminguard.orm.DaoMaster; import tw.fatminmin.xposed.minminguard.orm.DaoSession; import tw.fatminmin.xposed.minminguard.ui.UIUtils; import tw.fatminmin.xposed.minminguard.ui.dialog.AppDetailDialogFragment; import tw.fatminmin.xposed.minminguard.ui.fragments.MainFragment; import tw.fatminmin.xposed.minminguard.ui.models.AppDetails; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Created by fatminmin on 2015/10/1. */ public class AppsAdapter extends RecyclerView.Adapter<AppsAdapter.ViewHolder> { private final Context mContext; private final SharedPreferences mPref; private final DaoMaster.DevOpenHelper helper; private final SQLiteDatabase db; private final DaoMaster daoMaster; private final DaoSession daoSession; private final AppDataDao appDataDao; private ArrayList<AppDetails> appList; private Map<String, AppData> mAppDataMap; // retrieved AppData from sqlite private MainFragment.FragmentMode mMode; public AppsAdapter(Context context, ArrayList<AppDetails> list, MainFragment.FragmentMode mode) { super(); mContext = context; appList = list; Context ctx = ContextCompat.createDeviceProtectedStorageContext(context); if (ctx == null) ctx = context; mPref = ctx.getSharedPreferences(Common.MOD_PREFS, Context.MODE_PRIVATE); helper = new DaoMaster.DevOpenHelper(context, "mmg", null); db = helper.getWritableDatabase(); daoMaster = new DaoMaster(db); daoSession = daoMaster.newSession(); appDataDao = daoSession.getAppDataDao(); mMode = mode; mAppDataMap = new HashMap<>(); } public void setAppList(ArrayList<AppDetails> list) { appList = list; /* update appdata map */ mAppDataMap.clear(); for (AppDetails info : appList) { final String pkgName = info.getPackageName(); AppData appData = null; List<AppData> results = appDataDao.queryBuilder().where(AppDataDao.Properties.PkgName.eq(pkgName)).list(); if (results.size() == 1) { appData = results.get(0); appDataDao.refresh(appData); } mAppDataMap.put(pkgName, appData); } } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_app, parent, false); return new ViewHolder(v); } private void setState(String pkgName, boolean checked) { /* auto mode */ if (mMode == MainFragment.FragmentMode.AUTO) { return; } if (mMode == MainFragment.FragmentMode.BLACKLIST) { /* blacklist mode */ mPref.edit().putBoolean(pkgName, checked).apply(); } else { /* whitelist mode */ mPref.edit().putBoolean(Common.getWhiteListKey(pkgName), checked).apply(); } } @Override public void onBindViewHolder(ViewHolder holder, int position) { final AppDetails currentAppDetails = appList.get(position); final AppData appData = mAppDataMap.get(currentAppDetails.getPackageName()); if (appData != null && appData.getBlockNum() != 0) { holder.txtBlockNum.setText(mContext.getString(R.string.msg_block_num, appData.getBlockNum())); } else { holder.txtBlockNum.setText(""); } holder.imgAppIcon.setImageDrawable(currentAppDetails.getIcon()); holder.txtAppName.setText(currentAppDetails.getName()); if (mMode == MainFragment.FragmentMode.AUTO) { holder.switchEnable.setVisibility(View.GONE); } else { holder.switchEnable.setVisibility(View.VISIBLE); } holder.switchEnable.setChecked(currentAppDetails.isEnabled()); holder.switchEnable.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Switch sw = (Switch) v; setState(currentAppDetails.getPackageName(), sw.isChecked()); } }); holder.card.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { DialogFragment dialog = AppDetailDialogFragment.newInstance(currentAppDetails.getName(), currentAppDetails.getPackageName(), appData); AppCompatActivity activity = (AppCompatActivity) mContext; dialog.show(activity.getSupportFragmentManager(), "dialog"); } }); holder.imgAppIcon.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { UIUtils.restartApp(mContext, currentAppDetails.getPackageName()); } }); } @Override public int getItemCount() { return appList.size(); } public static class ViewHolder extends RecyclerView.ViewHolder { View card; ImageView imgAppIcon; TextView txtAppName; TextView txtBlockNum; Switch switchEnable; ViewHolder(View v) { super(v); card = v; imgAppIcon = v.findViewById(R.id.img_app_icon); txtAppName = v.findViewById(R.id.txt_app_name); txtBlockNum = v.findViewById(R.id.txt_block_num); switchEnable = v.findViewById(R.id.switch_enable); } } }