Problem with context - Xposed General

Hi, I have code:
Code:
Class<?> pm =
XposedHelpers.findClass(packageManagerService, null);
hookAllConstructors(pm, packageManagerServiceHook);
packageManagerServiceHook = new XC_MethodHook() {
@Override
protected void afterHookedMethod(final MethodHookParam param) throws Throwable {
Context context = (Context) XposedHelpers.getObjectField(
param.thisObject, "mContext");
if (context == null && param.args.length != 0) {
context = (Context) param.args[0];
}
XposedBridge.log(context==null? "null" : "not null");
if (context != null) {
mContext = context;
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ACTION_ENABLE_SIGNATURE_CHECK);
intentFilter.addAction(ACTION_DISABLE_SIGNATURE_CHECK);
mContext.registerReceiver(mBroadcastReceiver, intentFilter);
}
}
};
I get "not null" but then, I get NPE on line mContext.registerReceiver(mBroadcastReceiver, intentFilter); Any solution?

I'd check if mBroadcastReceiver is null, I don't see you assigning that. Otherwise post the full log.

Related

[Q] Grant an app more permissions than it requests [solved]

I have one app which can call java functions from scripts defined at runtime, but has not enough permissions to do most of the stuff, like toggling wifi.
So I tried to create a module hooking the Packagemanager to grant these permissions.
My code so far:
Code:
public class Hook implements IXposedHookLoadPackage, IXposedHookZygoteInit {
ArrayList<String> newPerms;
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
if(!loadPackageParam.packageName.equals("android"))return;
final Class<?> clsPMS = findClass("com.android.server.pm.PackageManagerService", loadPackageParam.classLoader);
XC_MethodHook hookGrantPermissions = new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
String pkgName = (String) getObjectField(param.args[0], "packageName");
if(!(pkgName.equals(Strings.LLX)||pkgName.equals(Strings.LL)))return;
//XposedBridge.log("Package: "+pkgName);
if(newPerms == null || newPerms.isEmpty() ) return;
ArrayList<String> origRequestedPermissions = (ArrayList<String>) getObjectField(param.args[0], "requestedPermissions");
param.setObjectExtra("orig_requested_permissions", origRequestedPermissions);
//XposedBridge.log("Old Permissions "+Arrays.toString(origRequestedPermissions.toArray()));
//XposedBridge.log("New Permissions "+Arrays.toString(newPerms.toArray()));
ArrayList<String> newRequestedPermissions = new ArrayList<>(origRequestedPermissions);
newRequestedPermissions.addAll(newPerms);
//XposedBridge.log("All Permissions"+Arrays.toString(newRequestedPermissions.toArray()));
//param.args[1] = true;
[U][B]setObjectField(param.args[0], "requestedPermissions", newRequestedPermissions);[/B][/U]
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
ArrayList<String> origRequestedPermissions = (ArrayList<String>) param.getObjectExtra("orig_requested_permissions");
if (origRequestedPermissions != null)
setObjectField(param.args[0], "requestedPermissions", origRequestedPermissions);
}
};
if (Build.VERSION.SDK_INT < 21) {
findAndHookMethod(clsPMS, "grantPermissionsLPw", "android.content.pm.PackageParser$Package", boolean.class, hookGrantPermissions);
} else {
findAndHookMethod(clsPMS, "grantPermissionsLPw", "android.content.pm.PackageParser$Package", boolean.class, String.class, hookGrantPermissions);
}
}
@Override
public void initZygote(StartupParam startupParam) throws Throwable {
XSharedPreferences pref = new XSharedPreferences(this.getClass().getPackage().getName(), Strings.PREF_NAME);
pref.makeWorldReadable();
newPerms = Strings.read(pref);
}
Sidenote: Code is partially forked from Appsettings module: https://github.com/rovo89/XposedAppSettings
The problem is: when I restart my phone after enabling the module, I just get a blackscreen after the bootanimation.
When I comment out the line marked fat underlined, it works, but does nothing (because this line is essential).
I have practically no idea why this isn't working.
I know that the input returned from Strings.read is valid.
My Question: What am I doing wrong?
LM13 said:
I have one app which can call java functions from scripts defined at runtime, but has not enough permissions to do most of the stuff, like toggling wifi.
So I tried to create a module hooking the Packagemanager to grant these permissions.
My code so far:
Code:
public class Hook implements IXposedHookLoadPackage, IXposedHookZygoteInit {
ArrayList<String> newPerms;
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
if(!loadPackageParam.packageName.equals("android"))return;
final Class<?> clsPMS = findClass("com.android.server.pm.PackageManagerService", loadPackageParam.classLoader);
XC_MethodHook hookGrantPermissions = new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
String pkgName = (String) getObjectField(param.args[0], "packageName");
if(!(pkgName.equals(Strings.LLX)||pkgName.equals(Strings.LL)))return;
//XposedBridge.log("Package: "+pkgName);
if(newPerms == null || newPerms.isEmpty() ) return;
ArrayList<String> origRequestedPermissions = (ArrayList<String>) getObjectField(param.args[0], "requestedPermissions");
param.setObjectExtra("orig_requested_permissions", origRequestedPermissions);
//XposedBridge.log("Old Permissions "+Arrays.toString(origRequestedPermissions.toArray()));
//XposedBridge.log("New Permissions "+Arrays.toString(newPerms.toArray()));
ArrayList<String> newRequestedPermissions = new ArrayList<>(origRequestedPermissions);
newRequestedPermissions.addAll(newPerms);
//XposedBridge.log("All Permissions"+Arrays.toString(newRequestedPermissions.toArray()));
//param.args[1] = true;
[U][B]setObjectField(param.args[0], "requestedPermissions", newRequestedPermissions);[/B][/U]
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
ArrayList<String> origRequestedPermissions = (ArrayList<String>) param.getObjectExtra("orig_requested_permissions");
if (origRequestedPermissions != null)
setObjectField(param.args[0], "requestedPermissions", origRequestedPermissions);
}
};
if (Build.VERSION.SDK_INT < 21) {
findAndHookMethod(clsPMS, "grantPermissionsLPw", "android.content.pm.PackageParser$Package", boolean.class, hookGrantPermissions);
} else {
findAndHookMethod(clsPMS, "grantPermissionsLPw", "android.content.pm.PackageParser$Package", boolean.class, String.class, hookGrantPermissions);
}
}
@Override
public void initZygote(StartupParam startupParam) throws Throwable {
XSharedPreferences pref = new XSharedPreferences(this.getClass().getPackage().getName(), Strings.PREF_NAME);
pref.makeWorldReadable();
newPerms = Strings.read(pref);
}
Sidenote: Code is partially forked from Appsettings module: https://github.com/rovo89/XposedAppSettings
The problem is: when I restart my phone after enabling the module, I just get a blackscreen after the bootanimation.
When I comment out the line marked fat underlined, it works, but does nothing (because this line is essential).
I have practically no idea why this isn't working.
I know that the input returned from Strings.read is valid.
My Question: What am I doing wrong?
Click to expand...
Click to collapse
I am doing something similar. Maybe you can get some ideas from my PermissionGranter at:
https://github.com/GravityBox/Gravi...co/lollipop/gravitybox/PermissionGranter.java
I thought it would be better to modify the query instead of lists itself, but I'll try that out. Thanks!
Now my Hook looks like this:
Code:
XC_MethodHook hookGrantPermissions = new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
String pkgName = (String) getObjectField(param.args[0], "packageName");
if (!(pkgName.equals(Strings.LLX) || pkgName.equals(Strings.LL))) return;
Object extras = getObjectField(param.args[0], "mExtras");
Set<String> grantedPerms = (Set<String>) getObjectField(extras, "grantedPermissions");
Object settings = getObjectField(param.thisObject, "mSettings");
Object permissions = getObjectField(settings, "mPermissions");
for (String perm : newPerms) {
Object permission = callMethod(permissions, "get", perm);
if (permission == null) continue;
grantedPerms.add(perm);
int[] gpGids = (int[]) getObjectField(extras, "gids");
int[] bpGids = (int[]) getObjectField(permission, "gids");
gpGids = (int[]) callStaticMethod(param.thisObject.getClass(),
"appendInts", gpGids, bpGids);
if (BuildConfig.DEBUG) XposedBridge.log("Permission added: " + permission);
}
}
};
But checkCallingOrSelfPermsisson still fails for the added permissions...
I get the log (in fact two times) but I still don't seem to have the permissions inside of the app.
Solved it myself. If there is a shared user, it has to be used instead of normal object.
Code:
XC_MethodHook hookGrantPermissions = new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
String pkgName = (String) getObjectField(param.args[0], "packageName");
if (!(pkgName.equals(Strings.LLX) || pkgName.equals(Strings.LL))) return;
Object extras = getObjectField(param.args[0], "mExtras");
Set<String> grantedPerms = (Set<String>) getObjectField(extras, "grantedPermissions");
Object sharedUser = getObjectField(extras, "sharedUser");
if(sharedUser != null) grantedPerms = (Set<String>) getObjectField(sharedUser, "grantedPermissions");
Object settings = getObjectField(param.thisObject, "mSettings");
Object permissions = getObjectField(settings, "mPermissions");
for (String perm : newPerms) {
Object permission = callMethod(permissions, "get", perm);
if (permission == null) continue;
grantedPerms.add(perm);
int[] gpGids = (int[]) getObjectField(sharedUser!=null?sharedUser:extras, "gids");
int[] bpGids = (int[]) getObjectField(permission, "gids");
callStaticMethod(param.thisObject.getClass(),
"appendInts", gpGids, bpGids);
if (BuildConfig.DEBUG) XposedBridge.log("Permission added: " + permission);
}
}
};
@C3C076 do you know any way how to get runtime (level dangerous) permissions on Android Marshmallow?
Getting normal permissions is actually a bit easier now, but I haven't found a way for runtime permissions.

Adding a Spinner and posting the data to database [volley]

public class MainActivity extends Activity {
EditText name, phonenumber, address;
Button insert;
RequestQueue requestQueue;
String insertUrl = "localhosti/insertCustomer.php";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/* CHECK INTERNET CONNECTION */
boolean mobileNwInfo = false;
ConnectivityManager conxMgr = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
try { mobileNwInfo = conxMgr.getActiveNetworkInfo().isConnected(); }
catch (NullPointerException e) { mobileNwInfo = false; }
if ( mobileNwInfo == false ) {
Toast.makeText(this, "No Network, please check your connection. ", Toast.LENGTH_LONG).show();
}
/* CHECK INTERNET CONNECTION PROCEDURE DONE */
name = (EditText) findViewById(R.id.editText);
phonenumber= (EditText) findViewById(R.id.editText2);
address = (EditText) findViewById(R.id.editText3);
insert = (Button) findViewById(R.id.insert);
requestQueue = Volley.newRequestQueue(getApplicationContext());
insert.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final ProgressDialog pd = new ProgressDialog(MainActivity.this);
pd.setMessage("Booking Service ....");
pd.show();
StringRequest request = new StringRequest(Request.Method.POST, insertUrl, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
pd.hide();
System.out.println(response.toString());
name.setText("");
phonenumber.setText("");
address.setText("");
Toast.makeText(getApplicationContext(), "Service successfully booked !!", Toast.LENGTH_LONG).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
pd.hide();
Toast.makeText(getApplicationContext(), "Error: Please try again later.", Toast.LENGTH_LONG).show();
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> parameters = new HashMap<String, String>();
parameters.put("name", name.getText().toString());
parameters.put("phonenumber", phonenumber.getText().toString());
parameters.put("address", address.getText().toString());
return parameters;
}
};
requestQueue.add(request);
}
});
}
}
Click to expand...
Click to collapse
how can i fetch the data from a spinner and post it to my db along with the current data ?

afterHookedMethod Variable assignment method

Code:
public class SuperHook implements IXposedHookLoadPackage, IXposedHookZygoteInit {
Config mConfig;
Gson mGson;
@Override
public void initZygote(StartupParam startupParam) throws Throwable {
mConfig = new Config();
mGson = new Gson();
}
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
Log.d("SuperHook", "handleLoadPackage imei:" + mConfig.getmImei());
if (loadPackageParam.packageName.equals("cn.superscript.supertools")) {
Class<?> classSuperService = XposedHelpers.findClass(SuperService.class.getName(), loadPackageParam.classLoader);
XposedHelpers.findAndHookMethod(classSuperService, "onStartCommand", Intent.class, int.class, int.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
Intent intent = (Intent) param.args[0];
String json = intent.getStringExtra("json");
mConfig = mGson.fromJson(json, new TypeToken<Config>() {
}.getType());
Log.d("SuperHook", "onStartCommand: imei = " + mConfig.getmImei());
}
});
}
}
}
Log:
01-21 18:49:56.220 664-664/? D/SuperHook: handleLoadPackage imei:null
01-21 18:49:56.240 664-664/? D/SuperHook: onStartCommand: imei = 3333333
01-21 18:50:00.930 757-757/com.android.settings D/SuperHook: handleLoadPackage imei:null
why handleLoadPackage imei = null , onStartCommand: imei = 3333333 successful.
Please help me, thank you

How to add image and text to both parentgroup and childgroup of expandablelistview

How to add image and text to both parentgroup and childgroup of expandablelistview dynamically from database.T his code uses expendable listview. I want to display image and text to parentgroup and childgroup of expendablelistview dynamically from database. i am a newbie in android development so please some one help me out.
This is my code:
public class CustomListAdapter15 extends BaseExpandableListAdapter {
List<HashMap<String, Object>> models, models2;
Context context;
LayoutInflater inflater;
ViewHolder viewHolder;
View view1;
// JSON Node names
private static final String TAG_SUCCESS = "success";
SharedPreferences sPref;
public CustomListAdapter15(Context context, List<HashMap<String, Object>> models2, List<HashMap<String, Object>> models) {
this.context = context;
this.models2 = models2; //parentItems
this.models = models; //childtems
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.counters = new int[30];
//this.session_email = sPref.getString("SESSION_UID","");
}
public class ViewHolder {
public TextView countt = null;
public ImageView likem = null, createButton;
//RelativeLayout rel, rel2;
LinearLayout rel;
private Button btnSend;
}
public void clear() {
if (models != null)
models.clear();
}
public int getItemViewType(int position) {
// TODO Auto-generated method stub
return position;
}
@override
public Object getChild(int groupPosition, int childPosition) {
//return null;
//return models.get((HashMap<String, Object>)models2.get(groupPosition)).get(childPosition);
return models.get(groupPosition).get(childPosition);
}
@override
public long getChildId(int groupPosition, int childPosition) {
//return 0;
return childPosition;
}
@override
public int getChildrenCount(int groupPosition) {
return ((HashMap<String, Object>) models.get(groupPosition)).size();
//return models.size();
}
@override
public Object getGroup(int groupPosition) {
//return null;
return models2.get(groupPosition);
}
@override
public int getGroupCount() {
return models2.size();
}
@override
public void onGroupCollapsed(int groupPosition) {
super.onGroupCollapsed(groupPosition);
}
@override
public void onGroupExpanded(int groupPosition) {
super.onGroupExpanded(groupPosition);
}
@override
public long getGroupId(int groupPosition) {
//return 0;
return groupPosition;
}
@override
public boolean hasStableIds() {
return true;
}
@override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
public HashMap<String, Object> getItem(int position) {
return models.get(position);
}
public HashMap<String, Object> getItem1(int position2) {
return models2.get(position2);
}
/ @override
public long getChildId(int listPosition, int expandedListPosition) {
return expandedListPosition;
}*/
@override
public View getChildView(int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
View view = convertView;
final ViewHolder viewHolder;
if (view == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.chat_right, null);
/*if(session_ph.equals((sphon)))
{
view = inflater.inflate(R.layout.chat_right, parent, false);
}
else if(!session_ph.equals((sphon)))
{
view = inflater.inflate(R.layout.chat_left, parent, false);
}*/
//view.setBackgroundColor(color_arr[pos]);
viewHolder = new ViewHolder();
/* viewHolder.gppho=(TextView)view.findViewById(R.id.gphn);
viewHolder.gadminph=(TextView)view.findViewById(R.id.gadphn);
viewHolder.rel = (LinearLayout)view.findViewById(R.id.comrel);*/
gppho = (TextView) view.findViewById(R.id.gphn);
gadminph = (TextView) view.findViewById(R.id.gadphn);
viewHolder.rel = (LinearLayout) view.findViewById(R.id.comrel);
// rel1 = (LinearLayout)view.findViewById(R.id.comrel);
/* HashMap<String, Object> item = models.get(position);
gppho.setText((CharSequence) item.get("SPHON"));
gadminph.setText((CharSequence) item.get("GAPHON"));
String gadm_ph=gadminph.getText().toString();
String sendersphon=gppho.getText().toString();
RelativeLayout.LayoutParams layoutParams =
(RelativeLayout.LayoutParams) rel1.getLayoutParams();
if(gadm_ph.equals((sendersphon)))
{
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT,RelativeLayout.TRUE);
rel1.setLayoutParams(layoutParams);
rel1.setBackground(getResources().getDrawable(R.drawable.bubble2_out));
//v1iew = inflater.inflate(R.layout.chat_right, parent, false);
}
else if(!gadm_ph.equals((sendersphon)))
{
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT,RelativeLayout.TRUE);
rel1.setLayoutParams(layoutParams);
rel1.setBackground(getResources().getDrawable(R.drawable.bubble1_in));
//view = inflater.inflate(R.layout.chat_left, parent, false);
}*/
viewHolder.rel.setOnLongClickListener(new View.OnLongClickListener() {
@override
public boolean onLongClick(View v) {
// TODO Auto-generated method stub
int position = (Integer) v.getTag();
HashMap<String, Object> item = models2.get(position);
gppho.setText((CharSequence) item.get("SPHON"));
gadminph.setText((CharSequence) item.get("GAPHON"));
String gadm_ph1 = gadminph.getText().toString();
String sendersphon1 = gppho.getText().toString();
gpida.setText((CharSequence) item.get("GID"));
pacmos = gpida.getText().toString();
Toast.makeText(Group_create_view_adm.this, gadm_ph1, Toast.LENGTH_SHORT).show();
Toast.makeText(Group_create_view_adm.this, sendersphon1, Toast.LENGTH_SHORT).show();
// removeItemFromList();
return true;
}
});
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.rel.setTag(childPosition);
final HashMap<String, Object> item = getItem(childPosition);
/* name.setText(((String)item.get(R.id.name)));
*
*/
gpida = (TextView) view.findViewById(R.id.gid);
gpnam = (TextView) view.findViewById(R.id.gnam);
gadminph = (TextView) view.findViewById(R.id.gadphn);
gpema = (TextView) view.findViewById(R.id.gema);
gppho = (TextView) view.findViewById(R.id.gphn);
namesa = (TextView) view.findViewById(R.id.senname);
msgsa = (TextView) view.findViewById(R.id.txt_msg);
tims = (TextView) view.findViewById(R.id.sentime);
imga = (ImageView) view.findViewById(R.id.gperimg);
gpida.setText((CharSequence) item.get("GID"));
gpnam.setText((CharSequence) item.get("GNAME"));
gadminph.setText((CharSequence) item.get("GAPHON"));
gpema.setText((CharSequence) item.get("SEMAIL"));
gppho.setText((CharSequence) item.get("SPHON"));
namesa.setText((CharSequence) item.get("SNAME"));
msgsa.setText((CharSequence) item.get("SCOMM"));
tims.setText((CharSequence) item.get("STIM"));
Picasso.with(context)
//.load("PIC")
.load((String) item.get("GPRIMG"))
// .centerCrop()
// .fit()
.into(imga);
rel1 = (LinearLayout) view.findViewById(R.id.comrel);
gadm_ph = gadminph.getText().toString();
sendersphon = gppho.getText().toString();
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
if (session_ph.equals((sendersphon))) {
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
rel1.setLayoutParams(layoutParams);
//rel1.setGravity(Gravity.RIGHT);
rel1.setBackground(getResources().getDrawable(R.drawable.bubble2_out));
//v1iew = inflater.inflate(R.layout.chat_right, parent, false);
} else if (!session_ph.equals((sendersphon))) {
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
rel1.setLayoutParams(layoutParams);
// rel1.setGravity(Gravity.LEFT);
rel1.setBackground(getResources().getDrawable(R.drawable.bubble1_in));
//view = inflater.inflate(R.layout.chat_left, parent, false);
}
if(childPosition == getChildrenCount(groupPosition)-1)
{
view = inflater.inflate(R.layout.chat_left,null);
viewHolder.btnSend =(Button)view.findViewById(R.id.btn_chat_send);
editText = (EditText)view.findViewById(R.id.msg_type);
//TextView txtFooter = (TextView)view.findViewById(R.id.txtFooter);
//txtFooter.setText(currentParent.textToFooter);
}
viewHolder.btnSend.setOnClickListener(new View.OnClickListener(){
@override
public void onClick(View v) {
int position = (Integer) v.getTag();
if (editText.getText().toString().trim().equals("")) {
Toast.makeText(Group_create_view_adm.this, "Please input some text...", Toast.LENGTH_LONG).show();
} else {
HashMap<String, Object> item = models.get(position);
pho.setText((CharSequence) item.get("PHON"));
pacm11=pho.getText().toString();
msg=editText.getText().toString();
new LoadAllProducts95().execute();
}
}
});
return view;
}
@override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
view1 = convertView;
if(view1==null)
{
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view1 = inflater.inflate(R.layout.groupss_view_row, null);
//view.setBackgroundColor(color_arr[pos]);
viewHolder = new ViewHolder();
viewHolder.createButton = (ImageView)view1.findViewById(R.id.pic123df);
viewHolder.createButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
int position = (Integer) v.getTag();
HashMap<String, Object> item = models.get(position);
pho.setText((CharSequence) item.get("PHON"));
pacm=pho.getText().toString();
Intent intent = new Intent(context, Friendsprofile2.class);
intent.putExtra("TITLE", pacm);
//Intent putExtra = intent.putExtra("title", item.get(pac));
//intent.putExtra("image", item.getImage());
//Start details activity
context.startActivity(intent);
}
});
view1.setTag(viewHolder);
}
else {
viewHolder = (ViewHolder) view1.getTag();
}
viewHolder.createButton.setTag(groupPosition);
// viewHolder.rel.setTag(position);
//viewHolder.rel2.setTag(position);
final HashMap<String, Object> item = getItem1(groupPosition);
/* name.setText(((String)item.get(R.id.name)));
*
*/
// like = (ImageView) view.findViewById(R.id.like);
//sharingButton = (ImageButton) view.findViewById(R.id.share);
//text =(TextView)view.findViewById(R.id.text123);
name=(TextView)view1.findViewById(R.id.name);
idam=(TextView)view1.findViewById(R.id.id);
pho=(TextView)view1.findViewById(R.id.phon);
pic =(ImageView)view1.findViewById(R.id.pic123df);
bio=(TextView)view1.findViewById(R.id.bio);
//gtot=(TextView)view.findViewById(R.id.gptat);
name.setText((CharSequence) item.get("NAME"));
idam.setText((CharSequence) item.get("IDAC"));
pho.setText((CharSequence) item.get("PHON"));
bio.setText((CharSequence) item.get("BIOK"));
//gtot.setText((CharSequence) item.get("GPTAT"));
// text.setText((CharSequence) item.get("TEXT"));
//rel=(RelativeLayout)view.findViewById(R.id.frpos);
sapar=(TextView)view1.findViewById(R.id.sap);
gree = (ImageView)view1.findViewById(R.id.green);
sapar.setText((CharSequence) item.get("STAT"));
stato=sapar.getText().toString();
phoneno=pho.getText().toString();
//abc=Integer.parseInt(stato);
if((stato.equals(1)))
{
// Toast.makeText(context, "abc", Toast.LENGTH_LONG).show();
Picasso.with(context)
//.load("PIC")
.load(R.mipmap.green)
.resize(30, 30)
// .centerCrop()
// .fit()
.into(gree);
// Toast.makeText(context, phoneno, Toast.LENGTH_LONG).show();
}
else if(!stato.equals(1))
{
// Toast.makeText(context, "koll", Toast.LENGTH_LONG).show();
Picasso.with(context)
//.load("PIC")
.load(R.mipmap.gray)
.resize(30, 30)
// .centerCrop()
// .fit()
.into(gree);
}
Picasso.with(context)
//.load("PIC")
.load((String)item.get("PIC"))
.resize(150, 150)
// .centerCrop()
// .fit()
.into(pic);
return view1;
}
}

Need help deleting childview from groupview in expandablelistview w/custom adapter

Hey guys, I am having problem with deleting the childview from my expandablelistview. It deletes (I think), however, when I add a new childview, it is the exact same as the one I just deleted.
youtu.be/eJjR9FEpaaY
codes below
My activity
Code:
public class PlanSetterAct extends AppCompatActivity {
private Button nextBtn;
private EditText planName, weekNum;
private ExpandableListView weekdayList;
List<String> listDataHeader;
HashMap<String, List<String>> listDataChild;
private PlanSetterListAdapter adapter;
private int childCount = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.plan_setter);
weekdayList = (ExpandableListView) findViewById(R.id.plan_setter_exercise_list);
nextBtn = (Button) findViewById(R.id.plan_next_btn);
planName = (EditText) findViewById(R.id.plan_name_edit);
weekNum = (EditText) findViewById(R.id.plan_num_edit);
prepareNextButton();
prepareExerciseList();
adapter = new PlanSetterListAdapter(this.getApplicationContext(),listDataHeader,listDataChild);
weekdayList.setAdapter(adapter);
exerciseListChildListener();
}
private void prepareNextButton(){
nextBtn.animate().setDuration(1000);
nextBtn.animate().translationXBy(-500);
nextBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(Checker.hasText(planName) && Checker.isNum(weekNum)){
Utilities.setButtonClickColor(nextBtn, Color.GREEN);
startActivity(new Intent(PlanSetterAct.this, UserMainAct.class));
finish();
Utilities.debugLog("Moving to UserMainAct");
}else{
Utilities.setButtonClickColor(nextBtn, Color.RED);
}
}
});
}
private void prepareExerciseList() {
listDataHeader = new ArrayList<String>();
listDataChild = new HashMap<String, List<String>>();
// Adding child data
listDataHeader.add("Monday");
listDataHeader.add("Tuesday");
listDataHeader.add("Wednesday");
listDataHeader.add("Thursday");
listDataHeader.add("Friday");
listDataHeader.add("Saturday");
listDataHeader.add("Sunday");
for(int i = 0; i < listDataHeader.size(); i++) {
listDataChild.put(listDataHeader.get(i), new ArrayList<String>());
}
}
private void exerciseListChildListener(){
weekdayList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
ExpandableListView expandableListView = (ExpandableListView) parent;
long pos = expandableListView.getExpandableListPosition(position);
int itemType = ExpandableListView.getPackedPositionType(pos);
int groupPosition = ExpandableListView.getPackedPositionGroup(pos);
int childPosition = ExpandableListView.getPackedPositionChild(pos);
List<String> parentGroup = listDataChild.get(listDataHeader.get(groupPosition));
if(itemType == ExpandableListView.PACKED_POSITION_TYPE_GROUP){
parentGroup.add(childPosition+"");
adapter.notifyDataSetChanged();
return true;
}else if(itemType == ExpandableListView.PACKED_POSITION_TYPE_CHILD){
debugLog("Parent position: " + groupPosition +" | child position: " + childPosition);
parentGroup.remove(childPosition);
adapter.notifyDataSetChanged();
return true;
}
return false;
}
});
}
}
My Adapter
Code:
public class PlanSetterListAdapter extends BaseExpandableListAdapter {
private Context context;
private List<String> listDataHeader;
private HashMap<String, List<String>> listDataChild;
public PlanSetterListAdapter(Context context, List<String> listDataHeader,
HashMap<String, List<String>> listChildData) {
this.context = context;
this.listDataHeader = listDataHeader;
this.listDataChild = listChildData;
}
@Override
public Object getChild(int groupPosition, int childPosititon) {
return this.listDataChild.get(this.listDataHeader.get(groupPosition))
.get(childPosititon);
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public View getChildView(int groupPosition, final int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
final LayoutInflater inflater;
if (convertView == null) {
inflater= (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.add_exercise_layout, null);
}
final LinearLayout txtListChild = (LinearLayout) convertView.findViewById(R.id.plan_setter_add_exercise);
final LinearLayout addExerciseLayout = (LinearLayout) txtListChild.getChildAt(0);
Button okBtn = (Button) addExerciseLayout.getChildAt(1);
//init and gone from xml
okBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
TextView errorView = (TextView) txtListChild.getChildAt(1);
TextView finalView = (TextView) txtListChild.getChildAt(2);
LinearLayout exerciseAddLayout = (LinearLayout) addExerciseLayout.getChildAt(0);
EditText exerciseNameEdit = ((EditText)exerciseAddLayout.getChildAt(0));
EditText exerciseLbsEdit = (EditText)exerciseAddLayout.getChildAt(2);
EditText exerciseRepsEdit = (EditText) exerciseAddLayout.getChildAt(4);
if(hasText(exerciseNameEdit) && isNum(exerciseLbsEdit) && isNum(exerciseRepsEdit)){
String exerciseNameStr = exerciseNameEdit.getText().toString();
String exerciseWeightStr = exerciseLbsEdit.getText().toString()+"lbs";
String exerciseRepsStr = exerciseLbsEdit.getText().toString()+"x";
finalView.setText(exerciseNameStr + " at " + exerciseWeightStr + " for " +exerciseRepsStr);
finalView.setTextSize(20);
//display
setVisibleAndAnimate(context,finalView);
addExerciseLayout.setVisibility(View.GONE);
errorView.setVisibility(View.GONE);
}else{
setVisibleAndAnimate(context,errorView);
}
}
});
return convertView;
}
@Override
public int getChildrenCount(int groupPosition) {
return this.listDataChild.get(this.listDataHeader.get(groupPosition))
.size();
}
@Override
public Object getGroup(int groupPosition) {
return this.listDataHeader.get(groupPosition);
}
@Override
public int getGroupCount() {
return this.listDataHeader.size();
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
String headerTitle = (String) getGroup(groupPosition);
if (convertView == null) {
LayoutInflater infalInflater = (LayoutInflater) this.context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = infalInflater.inflate(R.layout.expandable_list_parent, null);
}
TextView lblListHeader = (TextView) convertView
.findViewById(R.id.lblListHeader);
lblListHeader.setTypeface(null, Typeface.BOLD);
lblListHeader.setText(headerTitle);
return convertView;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}

Categories

Resources