private void addUniversalButtonLayoutToDialogView(String name, String signal) {
    TextWatcher tw =
        new TextWatcher() {
          @Override
          public void onTextChanged(CharSequence s, int start, int before, int count) {}

          @Override
          public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

          @Override
          public void afterTextChanged(Editable s) {
            sendChannelDetailsChangedBroadcast(
                getActivity(), null, 0, null, -1, getCurrentUniversalButtons());
          }
        };
    LinearLayout newUniversalButtonLayout = new LinearLayout(getActivity());
    newUniversalButtonLayout.setOrientation(LinearLayout.VERTICAL);

    LinearLayout nameLayout = new LinearLayout(getActivity());
    nameLayout.setOrientation(LinearLayout.HORIZONTAL);

    AppCompatEditText universalButtonNameEditText = new AppCompatEditText(getActivity());
    universalButtonNameEditText.setHint(R.string.name);
    universalButtonNameEditText.setText(name);
    universalButtonNameEditText.addTextChangedListener(tw);

    ImageButton deleteUniversalButton = new ImageButton(getActivity());
    deleteUniversalButton.setBackgroundResource(android.R.color.transparent);
    deleteUniversalButton.setImageResource(android.R.drawable.ic_menu_delete);
    deleteUniversalButton.setOnClickListener(
        new View.OnClickListener() {

          @Override
          public void onClick(View v) {
            buttonsList.removeView((View) v.getParent().getParent());
            sendChannelDetailsChangedBroadcast(
                getActivity(), null, 0, null, -1, getCurrentUniversalButtons());
          }
        });

    nameLayout.addView(
        universalButtonNameEditText,
        new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f));
    nameLayout.addView(deleteUniversalButton);

    AppCompatEditText universalButtonSignalEditText = new AppCompatEditText(getActivity());
    universalButtonSignalEditText.setHint(R.string.enter_network_signal);
    universalButtonSignalEditText.setText(signal);
    universalButtonSignalEditText.addTextChangedListener(tw);

    newUniversalButtonLayout.addView(nameLayout);
    newUniversalButtonLayout.addView(universalButtonSignalEditText);

    buttonsList.addView(newUniversalButtonLayout);
  }
  public MaterialEditText(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
    int[] attrSet = new int[] {android.R.attr.hint};
    TypedArray a = context.obtainStyledAttributes(attrs, attrSet, 0, 0);
    String hint = a.getString(0);
    a.recycle();
    if (hint != null) this.setHint(hint);

    AppCompatEditText editor = new AppCompatEditText(context, attrs);
    this.addView(editor);
    editor.setHint("");
    editor.setId(android.R.id.text1);
  }
  private void backupDialog(final Backup.PARTITION partition_type) {
    LinearLayout layout = new LinearLayout(getActivity());
    layout.setPadding(30, 30, 30, 30);

    final AppCompatEditText editText = new AppCompatEditText(getActivity());
    editText.setTextColor(
        getResources().getColor(Utils.DARKTHEME ? R.color.textcolor_dark : R.color.black));
    editText.setLayoutParams(
        new LinearLayout.LayoutParams(
            ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
    if (partition_type == Backup.PARTITION.BOOT) editText.setText(RootUtils.getKernelVersion());
    editText.setHint(getString(R.string.name));

    layout.addView(editText);

    new AlertDialog.Builder(getActivity())
        .setView(layout)
        .setNegativeButton(
            getString(R.string.cancel),
            new DialogInterface.OnClickListener() {
              @Override
              public void onClick(DialogInterface dialog, int which) {}
            })
        .setPositiveButton(
            getString(R.string.ok),
            new DialogInterface.OnClickListener() {
              @Override
              public void onClick(DialogInterface dialog, int which) {
                final String name = editText.getText().toString().trim();
                if (name.isEmpty()) {
                  Utils.toast(getString(R.string.empty_name), getActivity());
                  return;
                }

                File file = null;
                switch (partition_type) {
                  case BOOT:
                    file = boot;
                    break;
                  case RECOVERY:
                    file = recovery;
                    break;
                  case FOTA:
                    file = fota;
                    break;
                }
                if (file != null && new File(file.toString() + "/" + name + ".img").exists()) {
                  Utils.toast(getString(R.string.backup_already_exists), getActivity());
                  return;
                }

                new AsyncTask<Void, Void, Void>() {
                  private ProgressDialog progressDialog;

                  @Override
                  protected void onPreExecute() {
                    super.onPreExecute();
                    progressDialog = new ProgressDialog(getActivity());
                    progressDialog.setMessage(getString(R.string.backing_up));
                    progressDialog.setCancelable(false);
                    progressDialog.show();
                  }

                  @Override
                  protected Void doInBackground(Void... params) {
                    Backup.backup(name, partition_type);
                    return null;
                  }

                  @Override
                  protected void onPostExecute(Void aVoid) {
                    super.onPostExecute(aVoid);
                    getHandler()
                        .post(
                            new Runnable() {
                              @Override
                              public void run() {
                                create();
                                progressDialog.dismiss();
                              }
                            });
                  }
                }.execute();
              }
            })
        .show();
  }