* #32381: added proper screenlock (based on CSipSimple mechanism)
diff --git a/src/org/sflphone/fragments/CallFragment.java b/src/org/sflphone/fragments/CallFragment.java
index 858be93..08e27b3 100644
--- a/src/org/sflphone/fragments/CallFragment.java
+++ b/src/org/sflphone/fragments/CallFragment.java
@@ -31,6 +31,8 @@
 
 package org.sflphone.fragments;
 
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Locale;
 
@@ -45,6 +47,7 @@
 import org.sflphone.model.Conference;
 import org.sflphone.model.SipCall;
 import org.sflphone.service.ISipService;
+import org.sflphone.utils.CallProximityManager;
 
 import android.app.Activity;
 import android.app.Fragment;
@@ -59,6 +62,7 @@
 import android.hardware.SensorEventListener;
 import android.hardware.SensorManager;
 import android.os.Bundle;
+import android.os.PowerManager;
 import android.os.RemoteException;
 import android.util.Log;
 import android.view.KeyEvent;
@@ -71,12 +75,11 @@
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.ViewGroup;
-import android.view.WindowManager;
 import android.view.inputmethod.InputMethodManager;
 import android.widget.ImageButton;
 import android.widget.TextView;
 
-public class CallFragment extends Fragment implements Callback, SensorEventListener {
+public class CallFragment extends Fragment implements Callback{
 
     static final String TAG = "CallFragment";
 
@@ -88,6 +91,8 @@
     private Conference conf;
 
     private TextView callStatusTxt;
+    private TextView codecNameTxt;
+
     private BubblesView view;
     private BubbleModel model;
 
@@ -98,10 +103,19 @@
     private SensorManager mSensorManager;
 
     private Sensor mSensor;
-    
+
     TransferDFragment editName;
 
-    private TextView codecNameTxt;
+    private PowerManager.WakeLock fullLock;
+    private PowerManager.WakeLock partialLock;
+    private PowerManager.WakeLock proximityLock;
+    
+    private static final int PROXIMITY_SCREEN_OFF_WAKE_LOCK = 32;
+    private static final int WAIT_FOR_PROXIMITY_NEGATIVE = 1;
+    
+    private Method wakelockParameterizedRelease;
+
+    
 
     @Override
     public void onCreate(Bundle savedBundle) {
@@ -115,6 +129,22 @@
         mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
         this.setHasOptionsMenu(true);
 
+
+        
+//        PowerManager pm = (PowerManager) getActivity().getSystemService(Context.POWER_SERVICE);
+//        fullLock = pm.newWakeLock(PowerManager.ON_AFTER_RELEASE | PowerManager.ACQUIRE_CAUSES_WAKEUP, TAG);
+//        partialLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
+//        proximityLock = pm.newWakeLock(PROXIMITY_SCREEN_OFF_WAKE_LOCK, TAG);
+//        
+//        Method maybeRelease = null;
+//        try {
+//          maybeRelease = proximityLock.getClass().getDeclaredMethod("release", Integer.TYPE);
+//        } catch (NoSuchMethodException e) {
+//          Log.d("LockManager", "Parameterized WakeLock release not available on this device.");
+//        }
+//        wakelockParameterizedRelease = maybeRelease;
+        
+
     }
 
     /**
@@ -122,7 +152,6 @@
      */
     private static Callbacks sDummyCallbacks = new Callbacks() {
 
-
         @Override
         public ISipService getService() {
             return null;
@@ -137,7 +166,7 @@
         }
 
         @Override
-        public void slideChatScreen() {            
+        public void slideChatScreen() {
         }
     };
 
@@ -152,7 +181,7 @@
         public void startTimer();
 
         public void slideChatScreen();
-        
+
         public void replaceCurrentCallDisplayed();
     }
 
@@ -167,10 +196,10 @@
         // rootView.requestDisallowInterceptTouchEvent(true);
 
         mCallbacks = (Callbacks) activity;
-//        myself = SipCall.SipCallBuilder.buildMyselfCall(activity.getContentResolver(), "Me");
+        // myself = SipCall.SipCallBuilder.buildMyselfCall(activity.getContentResolver(), "Me");
 
     }
-    
+
     @Override
     public void onCreateOptionsMenu(Menu m, MenuInflater inf) {
         super.onCreateOptionsMenu(m, inf);
@@ -180,11 +209,11 @@
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         super.onOptionsItemSelected(item);
-//        switch (item.getItemId()) {
-//        case R.id.menuitem_chat:
-//            mCallbacks.slideChatScreen();
-//            break;
-//        }
+        // switch (item.getItemId()) {
+        // case R.id.menuitem_chat:
+        // mCallbacks.slideChatScreen();
+        // break;
+        // }
 
         return true;
     }
@@ -193,7 +222,7 @@
     public void onDetach() {
         super.onDetach();
         mCallbacks = sDummyCallbacks;
-        mSensorManager.unregisterListener(this);
+//        mSensorManager.unregisterListener(this);
     }
 
     @Override
@@ -204,13 +233,13 @@
     @Override
     public void onResume() {
         super.onResume();
-        mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL);
+//        mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL);
     }
 
     @Override
     public void onPause() {
         super.onPause();
-        mSensorManager.unregisterListener(this);
+//        mSensorManager.unregisterListener(this);
     }
 
     @Override
@@ -361,7 +390,7 @@
     private Bubble getBubbleFor(SipCall call, float x, float y) {
         Bubble contact_bubble = model.getBubble(call.getCallId());
         if (contact_bubble != null) {
-            ((BubbleContact)contact_bubble).setCall(call);
+            ((BubbleContact) contact_bubble).setCall(call);
             contact_bubble.attractor.set(x, y);
             return contact_bubble;
         }
@@ -371,16 +400,17 @@
         model.addBubble(contact_bubble);
         return contact_bubble;
     }
-    
+
     private Bubble getBubbleForUser(Conference conf, float x, float y) {
         Bubble contact_bubble = model.getBubble(conf.getId());
         if (contact_bubble != null) {
             contact_bubble.attractor.set(x, y);
-            ((BubbleUser)contact_bubble).setConference(conf);
+            ((BubbleUser) contact_bubble).setConference(conf);
             return contact_bubble;
         }
 
-        contact_bubble = new BubbleUser(getActivity(), CallContact.ContactBuilder.buildUserContact(getActivity().getContentResolver(), getResources().getString(R.string.me)), conf, x, y, BUBBLE_SIZE);
+        contact_bubble = new BubbleUser(getActivity(), CallContact.ContactBuilder.buildUserContact(getActivity().getContentResolver(), getResources()
+                .getString(R.string.me)), conf, x, y, BUBBLE_SIZE);
 
         model.addBubble(contact_bubble);
         return contact_bubble;
@@ -390,9 +420,9 @@
      * Should be called when a bubble is removed from the model
      */
     void bubbleRemoved(Bubble b) {
-//        if (b.associated_call == null) {
-//            return;
-//        }
+        // if (b.associated_call == null) {
+        // return;
+        // }
     }
 
     public void changeCallState(String callID, String newState) {
@@ -468,7 +498,7 @@
         editName = TransferDFragment.newInstance();
         Bundle b = new Bundle();
         try {
-            b.putParcelableArrayList("calls", (ArrayList<Conference>)mCallbacks.getService().getConcurrentCalls());
+            b.putParcelableArrayList("calls", (ArrayList<Conference>) mCallbacks.getService().getConcurrentCalls());
             b.putParcelable("call_selected", contact.associated_call);
             editName.setArguments(b);
             editName.setTargetFragment(this, REQUEST_TRANSFER);
@@ -489,7 +519,7 @@
         // check that soft input is hidden
         InputMethodManager lManager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
         lManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
-        if(editName != null && editName.isVisible()){
+        if (editName != null && editName.isVisible()) {
             editName.dismiss();
         }
     }
@@ -503,28 +533,46 @@
         callStatusTxt.setText(String.format("%d:%02d:%02d", duration / 3600, duration % 3600 / 60, duration % 60));
     }
 
-    @Override
-    public void onAccuracyChanged(Sensor sensor, int accuracy) {
+//    @Override
+//    public void onAccuracyChanged(Sensor sensor, int accuracy) {
+//
+//    }
 
-    }
-
-    @Override
-    public void onSensorChanged(SensorEvent event) {
-        if (event.values[0] == 0) {
-            WindowManager.LayoutParams params = getActivity().getWindow().getAttributes();
-            params.flags |= WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
-            params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
-            params.screenBrightness = 0.004f;
-            getActivity().getWindow().setAttributes(params);
-
-        } else {
-            WindowManager.LayoutParams params = getActivity().getWindow().getAttributes();
-            getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
-            params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
-            params.screenBrightness = 1.0f;
-            getActivity().getWindow().setAttributes(params);
-        }
-    }
+//    @Override
+//    public void onSensorChanged(SensorEvent event) {
+//        if (event.values[0] == 0) {
+//            // WindowManager.LayoutParams params = getActivity().getWindow().getAttributes();
+//            // params.flags |= WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
+//            // params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
+//            // params.screenBrightness = -1f;
+//            // getActivity().getWindow().setAttributes(params);
+//
+//        } else {
+//            // WindowManager.LayoutParams params = getActivity().getWindow().getAttributes();
+//            // getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
+//            // params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
+//            // params.screenBrightness = 1.0f;
+//            // getActivity().getWindow().setAttributes(params);
+//        }
+//    }
+    
+//    private void releaseProximityLock() {
+//        boolean released = false;
+//        if (wakelockParameterizedRelease != null) {
+//          try {
+//            wakelockParameterizedRelease.invoke(proximityLock, new Integer(WAIT_FOR_PROXIMITY_NEGATIVE));
+//            released = true;
+//          } catch (IllegalAccessException e) {
+//            Log.d("LockManager", "Failed to invoke release method", e);
+//          } catch (InvocationTargetException e) {
+//            Log.d("LockManager", "Failed to invoke release method", e);
+//          }
+//        }
+//
+//        if(!released) {
+//          proximityLock.release();
+//        }
+//      }
 
     public Conference getConference() {
         return conf;
@@ -532,11 +580,10 @@
 
     public void onKeyUp(int keyCode, KeyEvent event) {
         try {
-            
-            if(event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP || event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN)
+
+            if (event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP || event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN)
                 return;
-            
-            
+
             String toSend = Character.toString(event.getDisplayLabel());
             toSend.toUpperCase(Locale.getDefault());
             Log.d(TAG, "toSend " + toSend);