/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.android.cameraview.demo; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.DialogFragment; import android.support.v7.app.AlertDialog; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import com.google.android.cameraview.AspectRatio; import java.util.Arrays; import java.util.Set; /** * A simple dialog that allows user to pick an aspect ratio. */ public class AspectRatioFragment extends DialogFragment { private static final String ARG_ASPECT_RATIOS = "aspect_ratios"; private static final String ARG_CURRENT_ASPECT_RATIO = "current_aspect_ratio"; private Listener mListener; public static AspectRatioFragment newInstance(Set<AspectRatio> ratios, AspectRatio currentRatio) { final AspectRatioFragment fragment = new AspectRatioFragment(); final Bundle args = new Bundle(); args.putParcelableArray(ARG_ASPECT_RATIOS, ratios.toArray(new AspectRatio[ratios.size()])); args.putParcelable(ARG_CURRENT_ASPECT_RATIO, currentRatio); fragment.setArguments(args); return fragment; } @Override public void onAttach(Context context) { super.onAttach(context); mListener = (Listener) context; } @Override public void onDetach() { mListener = null; super.onDetach(); } @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final Bundle args = getArguments(); final AspectRatio[] ratios = (AspectRatio[]) args.getParcelableArray(ARG_ASPECT_RATIOS); if (ratios == null) { throw new RuntimeException("No ratios"); } Arrays.sort(ratios); final AspectRatio current = args.getParcelable(ARG_CURRENT_ASPECT_RATIO); final AspectRatioAdapter adapter = new AspectRatioAdapter(ratios, current); return new AlertDialog.Builder(getActivity()) .setAdapter(adapter, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int position) { mListener.onAspectRatioSelected(ratios[position]); } }) .create(); } private static class AspectRatioAdapter extends BaseAdapter { private final AspectRatio[] mRatios; private final AspectRatio mCurrentRatio; AspectRatioAdapter(AspectRatio[] ratios, AspectRatio current) { mRatios = ratios; mCurrentRatio = current; } @Override public int getCount() { return mRatios.length; } @Override public AspectRatio getItem(int position) { return mRatios[position]; } @Override public long getItemId(int position) { return getItem(position).hashCode(); } @Override public View getView(int position, View view, ViewGroup parent) { AspectRatioAdapter.ViewHolder holder; if (view == null) { view = LayoutInflater.from(parent.getContext()) .inflate(android.R.layout.simple_list_item_1, parent, false); holder = new AspectRatioAdapter.ViewHolder(); holder.text = (TextView) view.findViewById(android.R.id.text1); view.setTag(holder); } else { holder = (AspectRatioAdapter.ViewHolder) view.getTag(); } AspectRatio ratio = getItem(position); StringBuilder sb = new StringBuilder(ratio.toString()); if (ratio.equals(mCurrentRatio)) { sb.append(" *"); } holder.text.setText(sb); return view; } private static class ViewHolder { TextView text; } } public interface Listener { void onAspectRatioSelected(@NonNull AspectRatio ratio); } }