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
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.
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 ?
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 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;
}
}
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;
}
}