/* OpenSourceLicenseFragment.java Copyright (c) 2016 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.manager.setting; import android.app.AlertDialog; import android.app.Dialog; import android.app.DialogFragment; import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.FrameLayout; import android.widget.ListView; import android.widget.TextView; import org.deviceconnect.android.manager.R; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.logging.Logger; /** * オープンソースライセンスフラグメント. * * @author NTT DOCOMO, INC. */ public class OpenSourceLicenseFragment extends DialogFragment { /** * 属性:open_source_software. */ public static final String EXTRA_OSS = "open_source_software"; /** * ロガー. */ private Logger mLogger = Logger.getLogger("dconnect.manager"); @Override public Dialog onCreateDialog(final Bundle savedInstanceState) { FrameLayout lframe = new FrameLayout(getActivity()); ListView lv = new ListView(getActivity()); lv.setId(android.R.id.list); lv.setDrawSelectorOnTop(false); lframe.addView(lv, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); lframe.setBackgroundColor(getResources().getColor(android.R.color.background_light)); ArrayAdapter<Parcelable> adapter = new SoftwareArrayAdapter(getActivity(), R.layout.item_open_source_licenses); if (getArguments() != null && getArguments().containsKey(EXTRA_OSS)) { adapter.addAll(getArguments().getParcelableArrayList(EXTRA_OSS)); } ListView listView = (ListView) lframe.findViewById(android.R.id.list); listView.setAdapter(adapter); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(R.string.activity_settings_open_source_licenses); builder.setView(lframe); builder.setPositiveButton(R.string.activity_settings_close, new DialogInterface.OnClickListener() { @Override public void onClick(final DialogInterface dialog, final int which) { dialog.dismiss(); } }); return builder.create(); } /** * OpenSourceSoftwareインスタンスを作成する. * * @param software ソフトウェア名 * @param resId リソースID * @return OpenSourceSoftwareインスタンス */ public static OpenSourceSoftware createOpenSourceSoftware(final String software, final int resId) { return new OpenSourceSoftware(software, resId); } /** * オープンソースライセンス. */ public static class OpenSourceSoftware implements Parcelable { /** * バッファサイズ. */ private static final int BUFFER_SIZE = 1024; /** * ソフトウェア名. */ private String mSoftware; /** * ライセンスリソース. */ private String mLicenseText; /** * ライセンスリソースID. */ private int mLicenseResource; /** * Parcelableクリエイター. */ public static final Parcelable.Creator<OpenSourceSoftware> CREATOR = new Parcelable.Creator<OpenSourceSoftware>() { public OpenSourceSoftware createFromParcel(final Parcel in) { return new OpenSourceSoftware(in); } public OpenSourceSoftware[] newArray(final int size) { return new OpenSourceSoftware[size]; } }; /** * コンストラクタ. * * @param software ソフトウェア名 * @param resId リソースID */ public OpenSourceSoftware(final String software, final int resId) { mSoftware = software; mLicenseResource = resId; } /** * Parcelableコンストラクタ. * * @param in 入力 */ private OpenSourceSoftware(final Parcel in) { mSoftware = in.readString(); mLicenseResource = in.readInt(); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(final Parcel dest, final int flags) { dest.writeString(mSoftware); dest.writeInt(mLicenseResource); } /** * ソフトウェア名を取得する. * * @return ソフトウェア名 */ public String getSoftwareName() { return mSoftware; } /** * ライセンステキストを取得する. * * @return ライセンステキスト */ public String getLicenseText() { return mLicenseText; } /** * ライセンステキストを読み込む. * * @param context コンテキスト * @throws IOException I/Oエラーが発生した場合 */ public void loadLicenseText(final Context context) throws IOException { if (mLicenseText != null) { return; } if (mLicenseResource <= 0) { return; } InputStream is = null; try { ByteArrayOutputStream os = new ByteArrayOutputStream(); is = context.getResources().openRawResource(mLicenseResource); byte[] buf = new byte[BUFFER_SIZE]; while (true) { int len = is.read(buf); if (len < 0) { break; } os.write(buf, 0, len); } mLicenseText = new String(os.toByteArray(), "UTF-8"); } finally { if (is != null) { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } } } /** * サービス配列アダプタ. */ private class SoftwareArrayAdapter extends ArrayAdapter<Parcelable> { /** * レイアウトリソースID. */ private int mResourceId; /** * コンストラクタ. * * @param context コンテキスト * @param resource レイアウトリソースID */ public SoftwareArrayAdapter(final Context context, final int resource) { super(context, resource); mResourceId = resource; } /** * コンストラクタ. * * @param context コンテキスト * @param resource レイアウトリソースID * @param objects サービスリスト */ public SoftwareArrayAdapter(final Context context, final int resource, final List<Parcelable> objects) { super(context, resource, objects); mResourceId = resource; } /** * コンストラクタ. * * @param context コンテキスト * @param resource レイアウトリソースID * @param objects サービスリスト */ public SoftwareArrayAdapter(final Context context, final int resource, final OpenSourceSoftware[] objects) { super(context, resource, objects); mResourceId = resource; } @Override public View getView(final int position, final View convertView, final ViewGroup parent) { View view; if (convertView != null) { view = convertView; } else { LayoutInflater inflater = LayoutInflater.from(getContext()); view = inflater.inflate(mResourceId, null); } OpenSourceSoftware item = (OpenSourceSoftware) getItem(position); if (item.getLicenseText() == null) { try { item.loadLicenseText(getContext()); } catch (IOException e) { mLogger.warning(e.toString()); } } TextView titleView = (TextView) view.findViewById(android.R.id.text1); titleView.setText(item.getSoftwareName()); TextView bodyView = (TextView) view.findViewById(android.R.id.text2); bodyView.setVisibility(View.VISIBLE); bodyView.setText(item.getLicenseText()); return view; } } }