package com.iwedia.gui.components.dialogs; import android.content.Context; import android.content.res.TypedArray; import android.os.Handler; import android.util.Log; import android.view.Gravity; import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import com.iwedia.comm.IAudioControl; import com.iwedia.dtv.audio.AudioTrack; import com.iwedia.dtv.types.AudioChannelConfiguration; import com.iwedia.dtv.types.AudioDigitalType; import com.iwedia.dtv.types.AudioTrackType; import com.iwedia.gui.MainActivity; import com.iwedia.gui.R; import com.iwedia.gui.components.A4TVDialog; import com.iwedia.gui.components.A4TVTextView; import com.iwedia.gui.components.A4TVToast; import java.util.ArrayList; /** * Dialog for audio languages * * @author Branimir Pavlovic */ public class AudioLanguageDialog extends A4TVDialog implements A4TVDialogInterface, OnItemClickListener { private ListView listViewLanguages; private AdapterLanguages adapter; // ////////////////////////////////////////// // Veljko Ilkic // ////////////////////////////////////////// /** String contants */ public static final String QAA = "qaa"; public static final String ORIGINAL = "Original"; // ////////////////////////////////////////// // Veljko Ilkic // ////////////////////////////////////////// private ArrayList<AudioTrack> languagesAvailable = new ArrayList<AudioTrack>(); private Context ctx; private A4TVTextView textViewOnTop; private ImageView imageLine; private IAudioControl audioControl; public AudioLanguageDialog(Context context) { super(context, checkTheme(context), 0); ctx = context; fillDialog(); setDialogAttributes(); init(); } @Override public void fillDialog() { setContentView(R.layout.audio_language_dialog); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_F6: case KeyEvent.KEYCODE_A: { cancel(); return true; } default: break; } return super.onKeyDown(keyCode, event); } /** * Function that load theme * * @param ctx * @return */ private static int checkTheme(Context ctx) { TypedArray atts = ctx.getTheme().obtainStyledAttributes( new int[] { R.attr.A4TVDialog }); int i = atts.getResourceId(0, 0); atts.recycle(); return i; } // not needed here, attributes are passed by style @Override public void setDialogAttributes() { getWindow().getAttributes().width = MainActivity.dialogWidth; getWindow().getAttributes().height = MainActivity.dialogHeight; // if (MainActivity.screenWidth == WIDTH_720p // || MainActivity.screenHeight == WIDTH_720p) { // getWindow().getAttributes().height = HEIGHT_720p / 2; // getWindow().getAttributes().width = WIDTH_720p / 4; // // getWindow().getAttributes().x = -WIDTH_720p / 2; // getWindow().getAttributes().y = 0; // } // if (MainActivity.screenWidth == WIDTH_1080p // || MainActivity.screenHeight == WIDTH_1080p) { // getWindow().getAttributes().height = HEIGHT_1080p / 2; // getWindow().getAttributes().width = WIDTH_1080p / 4; // // getWindow().getAttributes().x = -WIDTH_1080p / 2; // getWindow().getAttributes().y = 0; // } } @Override public void show() { audioControl = null; try { audioControl = MainActivity.service.getAudioControl(); } catch (Exception e1) { e1.printStackTrace(); } if (audioControl != null) { if (languagesAvailable != null) { languagesAvailable.clear(); } try { int audioTrackCount = audioControl.getAudioTrackCount(); languagesAvailable = null; if (audioTrackCount != 0) { languagesAvailable = new ArrayList<AudioTrack>(); for (int i = 0; i < audioTrackCount; i++) { AudioTrack track = audioControl.getAudioTrack(i); Log.d(TAG, "Audio Lang Dialog: track=" + track); languagesAvailable.add(track); } } } catch (Exception e) { e.printStackTrace(); } if (languagesAvailable == null) { languagesAvailable = new ArrayList<AudioTrack>(); } // /////////////////////////////////// // Veljko Ilkic // /////////////////////////////////// adapter.notifyDataSetChanged(); if (languagesAvailable.size() < 2) { A4TVToast toast = new A4TVToast(getContext()); toast.showToast(R.string.only_one_audio_language); } else { super.show(); new Handler().postDelayed(new Runnable() { @Override public void run() { int index = 0; try { index = audioControl.getCurrentAudioTrackIndex(); } catch (Exception e) { e.printStackTrace(); } if (index > -1 && index < languagesAvailable.size()) { listViewLanguages.requestFocusFromTouch(); listViewLanguages.setSelection(index); } } }, 100); } } } /** Take reference of list view and bind it with adapter */ private void init() { listViewLanguages = (ListView) findViewById(R.id.listViewAudioLanguage); adapter = new AdapterLanguages(); listViewLanguages.setAdapter(adapter); listViewLanguages.setOnItemClickListener(this); listViewLanguages.setScrollBarStyle(View.SCROLLBARS_INSIDE_INSET); listViewLanguages.setScrollbarFadingEnabled(false); findViewById(R.id.linearLayoutDialogContent).setLayoutParams( new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 0, 3.8f)); textViewOnTop = (A4TVTextView) findViewById(R.id.aTVTextViewMessage); textViewOnTop.setText(R.string.choose_audio_language); textViewOnTop .setLayoutParams(new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, MainActivity.dialogListElementHeight)); textViewOnTop.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL); textViewOnTop.setPadding( (int) ctx.getResources().getDimension(R.dimen.padding_medium), 0, 0, 0); imageLine = (ImageView) findViewById(R.id.imageViewHorizLine); // get drawable from theme for image source TypedArray atts = ctx.getTheme().obtainStyledAttributes( new int[] { R.attr.DialogSmallUpperDividerLine }); int backgroundID = atts.getResourceId(0, 0); imageLine.setBackgroundResource(backgroundID); atts.recycle(); } private class AdapterLanguages extends BaseAdapter { private final float LAYOUT_SUM = 5, AUDIOLANGUAGE_SUM = 2.0f, AUDIOTYPE_SUM = 1.0f, AUDIOCODEC_SUM = 1.0f, AUDIOCHANNEL_SUM = 1.0f; @Override public int getCount() { return languagesAvailable.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { convertView = new LinearLayout(ctx); A4TVTextView textViewAudioLanguage = new A4TVTextView(ctx); A4TVTextView textViewAudioType = new A4TVTextView(ctx); A4TVTextView textViewDigitalAudioEncodingMode = new A4TVTextView( ctx); A4TVTextView textViewChannels = new A4TVTextView(ctx); // set linear layout ((LinearLayout) convertView) .setOrientation(LinearLayout.HORIZONTAL); ((LinearLayout) convertView).setWeightSum(LAYOUT_SUM); (convertView).setLayoutParams(new AbsListView.LayoutParams( LayoutParams.MATCH_PARENT, MainActivity.dialogListElementHeight)); ((LinearLayout) convertView).setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL); (convertView).setPadding( (int) ctx.getResources() .getDimension(R.dimen.padding_large), 0, (int) ctx .getResources() .getDimension(R.dimen.padding_medium), 0); (convertView).setBackgroundResource(R.drawable.list_view_selector); // add text views to linear layout ((LinearLayout) convertView).addView(textViewAudioLanguage); ((LinearLayout) convertView).addView(textViewAudioType); ((LinearLayout) convertView) .addView(textViewDigitalAudioEncodingMode); ((LinearLayout) convertView).addView(textViewChannels); // set up text views textViewAudioType.setGravity(Gravity.RIGHT | Gravity.CENTER_VERTICAL); String typeTrackName = getTypeString(languagesAvailable.get( position).getAudioTrackType()); textViewAudioType.setText(typeTrackName); textViewAudioType.setLayoutParams(new LinearLayout.LayoutParams(0, LayoutParams.MATCH_PARENT, AUDIOTYPE_SUM)); textViewDigitalAudioEncodingMode.setGravity(Gravity.RIGHT | Gravity.CENTER_VERTICAL); String encodingName = getCodecString(languagesAvailable.get( position).getAudioDigitalType()); textViewDigitalAudioEncodingMode.setText(encodingName); textViewDigitalAudioEncodingMode .setLayoutParams(new LinearLayout.LayoutParams(0, LayoutParams.MATCH_PARENT, AUDIOCODEC_SUM)); textViewChannels .setGravity(Gravity.RIGHT | Gravity.CENTER_VERTICAL); String channelsName = getChannleString(languagesAvailable.get( position).getAudioChannleCfg()); textViewChannels.setText(channelsName); textViewChannels.setLayoutParams(new LinearLayout.LayoutParams(0, LayoutParams.MATCH_PARENT, AUDIOCHANNEL_SUM)); textViewAudioLanguage.setGravity(Gravity.CENTER_VERTICAL); textViewAudioLanguage.setText(languagesAvailable.get(position) .getLanguage()); textViewAudioLanguage .setLayoutParams(new LinearLayout.LayoutParams(0, LayoutParams.MATCH_PARENT, AUDIOLANGUAGE_SUM)); return convertView; } } @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { try { audioControl.setCurrentAudioTrack(arg2); AudioLanguageDialog.this.cancel(); } catch (Exception e) { A4TVToast toast = new A4TVToast(ctx); toast.showToast(R.string.error_with_playing_audio); e.printStackTrace(); } } // this is not needed here @Override public void returnArrayListsWithDialogContents( ArrayList<ArrayList<Integer>> contentList, ArrayList<ArrayList<Integer>> contentListIDs, ArrayList<Integer> titleIDs) { } private String getCodecString(AudioDigitalType encodingMode) { switch (encodingMode) { case UNKNOWN: return "UNKNOWN"; case LPCM: return "LPCM"; case AC2: return "AC2"; case AC3: return "AC3"; case EAC3: return "EAC3"; case MPEG1: return "MPEG1"; case MP3: return "MP3"; case MPEG2: return "MPEG2"; case AAC: return "AAC"; case HEAAC: return "HEAAC"; case DTS: return "DTS"; case DTS_HD: return "DTS_HD"; case ATRAC: return "ATRAC"; case OBA: return "OBA"; case MLP: return "MLP"; case CDDA: return "CDDA"; } return ""; } private String getTypeString(AudioTrackType trackType) { switch (trackType) { case AUDIO: return "AUDIO"; case AUDIO_DESCRIPTION: return "AD"; case HEARING_IMPAIRED: return "HI"; case DIALOG: return "DIALOG"; case COMENTARY: return "COMENTARY"; case VOICEOVER: return "VOICEOVER"; case EMERGENCY: return "EMERGENCY"; } return "AUDIO"; } private String getChannleString(AudioChannelConfiguration audioChannels) { switch (audioChannels) { case UNSPECIFIED: return ""; case MONO: return "MONO"; case STEREO: return "STEREO"; case MULTICHANNEL: return "SURROUND"; } return ""; } }