@Override
  public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof OSEditFragmentInteractionListener) {
      mListener = (OSEditFragmentInteractionListener) context;
    } else {
      throw new RuntimeException(context.toString() + " must be OSEditFragmentInteractionListener");
    }

    SCHEMES.put(
        SCHEMEID_ANDROID_DYNSYS_BINDOTHER,
        new PartitionScheme(
            getContext(),
            R.string.scheme_android_dynsystem_bindother,
            new PartitionScheme.Callback() {
              @Override
              public void onSetDefaults() {
                ArrayList<OperatingSystem.Partition> list = new ArrayList<>();
                FSTab fsTab = mListener.getDeviceInfo().getFSTab();
                for (FSTabEntry entry : fsTab.getFSTabEntries()) {
                  if (!entry.isMultiboot()) continue;

                  String name = entry.getMountPoint().substring(1);
                  boolean is_bind = entry.getFsType().equals("auto");

                  int type;
                  if (name.equals("system")) type = OperatingSystem.Partition.TYPE_DYNFILEFS;
                  else if (is_bind) type = OperatingSystem.Partition.TYPE_BIND;
                  else type = OperatingSystem.Partition.TYPE_LOOP;

                  long size = -1;
                  OperatingSystemEditActivity.MultibootPartitionInfo info =
                      Util.getPartitionInfoByName(mListener.getMultibootPartitionInfo(), name);
                  if (info != null && type != OperatingSystem.Partition.TYPE_BIND) size = info.size;

                  list.add(new OperatingSystem.Partition(name, name, type, size));
                }
                mOperatingSystem.setPartitions(list);
              }
            }));

    SCHEMES.put(
        SCHEMEID_ANDROID_BINDALL,
        new PartitionScheme(
            getContext(),
            R.string.scheme_android_bindall,
            new PartitionScheme.Callback() {
              @Override
              public void onSetDefaults() {
                ArrayList<OperatingSystem.Partition> list = new ArrayList<>();
                FSTab fsTab = mListener.getDeviceInfo().getFSTab();
                for (FSTabEntry entry : fsTab.getFSTabEntries()) {
                  if (!entry.isMultiboot()) continue;

                  String name = entry.getMountPoint().substring(1);
                  boolean is_bind = entry.getFsType().equals("auto");

                  int type;
                  if (is_bind) type = OperatingSystem.Partition.TYPE_BIND;
                  else type = OperatingSystem.Partition.TYPE_LOOP;

                  long size = -1;
                  OperatingSystemEditActivity.MultibootPartitionInfo info =
                      Util.getPartitionInfoByName(mListener.getMultibootPartitionInfo(), name);
                  if (info != null && type != OperatingSystem.Partition.TYPE_BIND) size = info.size;

                  list.add(new OperatingSystem.Partition(name, name, type, size));
                }
                mOperatingSystem.setPartitions(list);
              }
            }));

    SCHEMES.put(
        SCHEMEID_ANDROID_DYNSYS_LOOPOTHER,
        new PartitionScheme(
            getContext(),
            R.string.scheme_android_dynsystem_loopother,
            new PartitionScheme.Callback() {
              @Override
              public void onSetDefaults() {
                ArrayList<OperatingSystem.Partition> list = new ArrayList<>();
                FSTab fsTab = mListener.getDeviceInfo().getFSTab();
                for (FSTabEntry entry : fsTab.getFSTabEntries()) {
                  if (!entry.isMultiboot()) continue;

                  String name = entry.getMountPoint().substring(1);
                  int type;
                  if (name.equals("system")) type = OperatingSystem.Partition.TYPE_DYNFILEFS;
                  else type = OperatingSystem.Partition.TYPE_LOOP;

                  long size = -1;
                  OperatingSystemEditActivity.MultibootPartitionInfo info =
                      Util.getPartitionInfoByName(mListener.getMultibootPartitionInfo(), name);
                  if (info != null) size = info.size;

                  list.add(new OperatingSystem.Partition(name, name, type, size));
                }
                mOperatingSystem.setPartitions(list);
              }
            }));

    SCHEMES.put(
        SCHEMEID_ANDROID_LOOPALL,
        new PartitionScheme(
            getContext(),
            R.string.scheme_android_loopall,
            new PartitionScheme.Callback() {
              @Override
              public void onSetDefaults() {
                ArrayList<OperatingSystem.Partition> list = new ArrayList<>();
                FSTab fsTab = mListener.getDeviceInfo().getFSTab();
                for (FSTabEntry entry : fsTab.getFSTabEntries()) {
                  if (!entry.isMultiboot()) continue;

                  String name = entry.getMountPoint().substring(1);

                  long size = -1;
                  OperatingSystemEditActivity.MultibootPartitionInfo info =
                      Util.getPartitionInfoByName(mListener.getMultibootPartitionInfo(), name);
                  if (info != null) size = info.size;

                  list.add(
                      new OperatingSystem.Partition(
                          name, name, OperatingSystem.Partition.TYPE_LOOP, size));
                }
                mOperatingSystem.setPartitions(list);
              }
            }));

    mOperatingSystem = mListener.getOperatingSystem();
    mOperatingSystem.addChangeListener(this);
  }