package com.android.settings.dlna; import com.lge.dlnaserver.IDlnaEnabler; import com.lge.dlnaserver.IDlnaEnablerListener; import android.app.AlertDialog; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.ServiceConnection; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Handler; import android.os.IBinder; import android.os.RemoteException; import android.preference.CheckBoxPreference; import android.preference.Preference; import com.android.settings.R; public class DlnaEnabler implements Preference.OnPreferenceChangeListener { private static final String TAG = "DlnaEnabler"; private final Context mContext; private CheckBoxPreference mDlnaEnabled; private WifiManager mWifiManager; private IDlnaEnabler mBindService; private Handler mHandler = new Handler(); public static final int DLNA_STATE_DISABLED = 0; public static final int DLNA_STATE_DISABLING = 1; public static final int DLNA_STATE_ENABLED = 2; public static final int DLNA_STATE_ENABLING = 3; public static final int DLNA_STATE_UNKNOWN = 4; //============================ // dlna service callbacks //============================ private IDlnaEnablerListener mListener = new IDlnaEnablerListener.Stub() { public void startShareComplete(int err) throws RemoteException { mHandler.post(new Runnable(){ public void run() { mDlnaEnabled.setSummary(mContext.getString(R.string.dlna_summary_on)); mDlnaEnabled.setEnabled(true); mDlnaEnabled.setChecked(true); } }); } public void stopShareComplete(int err) throws RemoteException { mHandler.post(new Runnable(){ public void run() { mDlnaEnabled.setSummary(mContext.getString(R.string.dlna_summary_off)); mDlnaEnabled.setEnabled(true); mDlnaEnabled.setChecked(false); } }); } public void statusUpdate() throws RemoteException { mHandler.post(new Runnable(){ public void run() { setStatusSync(); } }); } }; public DlnaEnabler(Context context, CheckBoxPreference dlnaEnabled, WifiManager wifiManager) { mContext = context; mDlnaEnabled = dlnaEnabled; mWifiManager = wifiManager; bindDlnaServcie(); } private void bindDlnaServcie() { Intent intent = new Intent("com.lge.dlna.DlnaService"); mContext.startService(intent); if(mBindService == null) { Intent i = new Intent("com.lge.dlna.DlnaService"); i.putExtra("isEnabler", true); boolean result = mContext.bindService(i, mConnection, Context.BIND_AUTO_CREATE); } } public void unbindDlnaService() { if(mBindService != null) { try { if(mBindService != null) mBindService.unregisterListener(null); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } mBindService = null; mContext.unbindService(mConnection); } } private ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName name, IBinder service) { mBindService = IDlnaEnabler.Stub.asInterface(service); try { if(mBindService != null) mBindService.registerListener(mListener); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } mHandler.post(new Runnable(){ public void run() { setStatusSync(); } }); } public void onServiceDisconnected(ComponentName name) { try { if(mBindService != null) mBindService.unregisterListener(mListener); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } mBindService = null; } }; public void setStatusSync() { if(mBindService == null) return; int status = -1; try { status = mBindService.getState(); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } switch (status) { case DLNA_STATE_DISABLED: mDlnaEnabled.setSummary(mContext.getString(R.string.dlna_summary_off)); mDlnaEnabled.setChecked(false); mDlnaEnabled.setEnabled(true); break; case DLNA_STATE_DISABLING: mDlnaEnabled.setSummary(mContext.getString(R.string.dlna_summary_off_ing)); mDlnaEnabled.setChecked(true); mDlnaEnabled.setEnabled(false); break; case DLNA_STATE_ENABLED: mDlnaEnabled.setSummary(mContext.getString(R.string.dlna_summary_on)); mDlnaEnabled.setChecked(true); mDlnaEnabled.setEnabled(true); break; case DLNA_STATE_ENABLING: mDlnaEnabled.setSummary(mContext.getString(R.string.dlna_summary_on_ing)); mDlnaEnabled.setChecked(false); mDlnaEnabled.setEnabled(false); break; case DLNA_STATE_UNKNOWN: default: mDlnaEnabled.setSummary(mContext.getString(R.string.dlna_summary_off)); mDlnaEnabled.setChecked(false); mDlnaEnabled.setEnabled(false); break; } } public void resume() { mDlnaEnabled.setOnPreferenceChangeListener(this); try { if(mBindService != null) mBindService.registerListener(mListener); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } setStatusSync(); } public void pause() { mDlnaEnabled.setOnPreferenceChangeListener(null); try { if(mBindService != null) mBindService.unregisterListener(mListener); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public boolean onPreferenceChange(Preference preference, Object value) { if (preference == mDlnaEnabled) { setDlnaEnabled((Boolean) value); } // Don't update UI to opposite state until we're sure return false; } private void setDlnaEnabled(final boolean enable) { if(enable && !isWifiConnected()){ createWifiConnectPopup(); return; } if(mBindService != null) { mDlnaEnabled.setEnabled(false); try { if(enable) { mDlnaEnabled.setSummary(mContext.getString(R.string.dlna_summary_on_ing)); mBindService.startShare(); }else{ mDlnaEnabled.setSummary(mContext.getString(R.string.dlna_summary_off_ing)); mBindService.stopShare(); } } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public boolean isWifiConnected() { if(mWifiManager == null) return false; int ipAddress = 0; if(mWifiManager.isWifiEnabled()) { WifiInfo xWifiInfo = mWifiManager.getConnectionInfo(); if(xWifiInfo != null) ipAddress = xWifiInfo.getIpAddress(); } if(ipAddress == 0) return false; else return true; } private void createWifiConnectPopup(){ AlertDialog.Builder adb = new AlertDialog.Builder(mContext); adb.setCustomTitle(null); adb.setMessage(R.string.dlna_dlg_goto_wifi); adb.setPositiveButton(R.string.dlna_ok, new DialogInterface.OnClickListener(){ public void onClick(DialogInterface dialog, int which) { mContext.startActivity(new Intent(android.provider.Settings.ACTION_WIFI_SETTINGS)); } }); adb.setNegativeButton(R.string.dlna_cancel, new DialogInterface.OnClickListener(){ public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); adb.show(); } }