Chinaunix首页 | 论坛 | 博客
  • 博客访问: 353196
  • 博文数量: 570
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2015-11-17 10:38
文章分类

全部博文(570)

文章存档

2015年(570)

我的朋友

分类: LINUX

2015-11-17 10:48:04

原文地址:模拟光感的实现 作者:dixiaobing

目的

通过代码模拟光传感器的实现

主要思路

接通电话或者拔打电话的时候,五秒后屏灭,按键后屏亮!

代码实现



+++ b/alps/packages/apps/Phone/src/com/android/phone/InCallScreen.java
@@ -828,6 +828,12 @@ public class InCallScreen extends Activity
 
         mApp = PhoneApp.getInstance();
         mApp.setInCallScreenInstance(this);
+		
+		boolean enable_lockindail = getResources().getBoolean(R.bool.enable_lockindail);
+		if(lockReceiver == null && enable_lockindail == true){
+			lockReceiver = new CloseLockActivityReceiver();
+			registerReceiver(lockReceiver, getLockIntentFilter());
+		}
         
         // Make sure this is a voice-capable device.
         if (!PhoneApp.sVoiceCapable) {
@@ -1375,6 +1381,15 @@ public class InCallScreen extends Activity
     protected void onStop() {
         if (DBG) log("onStop()...");
         super.onStop();
+		
+		Intent lockintent = new Intent(lockAction);
+		Bundle bundle = new Bundle();
+		bundle.putString("lock", "stop");
+		lockintent.putExtras(bundle);
+		sendBroadcast(lockintent);
+		if(LockinDailerActivity._instance != null){
+			LockinDailerActivity._instance.finish();
+		}
 
         getWindow().getDecorView().getViewTreeObserver().removeOnPostDrawListener(mPostDrawListener);
 
@@ -1420,6 +1435,19 @@ public class InCallScreen extends Activity
         unregisterReceiver(mLocaleChangeReceiver);
         unregisterReceiver(mDMLockReceiver);
 
+		if(lockReceiver != null){
+			Intent lockintent = new Intent(lockAction);
+			Bundle bundle = new Bundle();
+			bundle.putString("lock", "stop");
+			lockintent.putExtras(bundle);
+			sendBroadcast(lockintent);
+			Log.i("aron","sendBroadcast stop");
+			if(LockinDailerActivity._instance != null)
+					LockinDailerActivity._instance.finish();
+			LOCK_TIME = 3;
+			unregisterReceiver(lockReceiver);
+		}
+
         mApp.clearInCallScreenInstance(this);
 
         // Clear out the InCallScreen references in various helper objects
@@ -2630,10 +2658,60 @@ public class InCallScreen extends Activity
         }
         updateLocalCache();
 
+        mForegroundLastState = mForegroundCall.getState();
+        mBackgroundLastState = mBackgroundCall.getState();
+        mRingingLastState = mRingingCall.getState();
+        //mLastInCallScreenMode = mInCallScreenMode;
         if(DBG) log("fgCall state : " + mForegroundCall.getState());
         if(DBG) log("bgCall state : " + mBackgroundCall.getState());        
         if(DBG) log("ringingCall state : " + mRingingCall.getState());
-
+		Log.i("zyc"," mForegroundLastState = " + mForegroundLastState
+		+ " mBackgroundLastState = " + mBackgroundLastState
+		+ " mRingingLastState = " + mRingingLastState
+//		+ " mLastInCallScreenMode = " + mLastInCallScreenMode
+		);
+        if(Call.State.ACTIVE == mForegroundLastState){
+        	Intent lockintent = new Intent(lockAction);
+        	Bundle bundle = new Bundle();
+        	bundle.putString("lock", "start");
+        	lockintent.putExtras(bundle);
+        	sendBroadcast(lockintent);
+        	Log.i("zyc","ACTIVE sendBroadcast start");
+        }else if(Call.State.DISCONNECTED == mForegroundLastState){
+        	Intent lockintent = new Intent(lockAction);
+        	Bundle bundle = new Bundle();
+        	bundle.putString("lock", "stop");
+        	lockintent.putExtras(bundle);
+        	sendBroadcast(lockintent);
+        	Log.i("zyc","DISCONNECTED sendBroadcast stop");
+        	LOCK_TIME = 3;
+        	if(LockinDailerActivity._instance != null){
+        		LockinDailerActivity._instance.finish();
+               }
+        }else if(Call.State.DISCONNECTING == mForegroundLastState){
+        	Intent lockintent = new Intent(lockAction);
+        	Bundle bundle = new Bundle();
+        	bundle.putString("lock", "stop");
+        	lockintent.putExtras(bundle);
+        	sendBroadcast(lockintent);
+        	Log.i("zyc","DISCONNECTING sendBroadcast stop");
+        	LOCK_TIME = 3;
+        	if(LockinDailerActivity._instance != null){
+        		LockinDailerActivity._instance.finish();
+               }
+        } else if(mApp.inCallUiState.inCallScreenMode == InCallScreenMode.CALL_ENDED){
+        	Intent lockintent = new Intent(lockAction);
+        	Bundle bundle = new Bundle();
+        	bundle.putString("lock", "stop");
+        	lockintent.putExtras(bundle);
+        	sendBroadcast(lockintent);
+        	Log.i("zyc","CALL_ENDED sendBroadcast stop");
+        	LOCK_TIME = 3;
+        	if(LockinDailerActivity._instance != null){
+        		LockinDailerActivity._instance.finish();
+               }
+        }
+        
         // Update the onscreen UI.
         // We use requestUpdateScreen() here (which posts a handler message)
         // instead of calling updateScreen() directly, which allows us to avoid
@@ -4008,6 +4086,12 @@ public class InCallScreen extends Activity
 
         // Also, any time we hold or unhold, force the DTMF dialpad to close.
         hideDialpadInternal(true);  // do the "closing" animation
+		Intent lockintent = new Intent("com.android.phone.lockindail");
+		Bundle bundle = new Bundle();
+		bundle.putString("lock", "reset");
+		lockintent.putExtras(bundle);
+		getApplicationContext().sendBroadcast(lockintent);
+		Log.i("zyc","onHoldClick sendBroadcast reset");
     }
 
     /**
@@ -4038,6 +4122,12 @@ public class InCallScreen extends Activity
             if (VTCallUtils.VTScreenMode.VT_SCREEN_OPEN == mVTInCallScreen.getVTScreenMode())
             mVTInCallScreen.updateVTScreen(mVTInCallScreen.getVTScreenMode());
         }
+		Intent lockintent = new Intent("com.android.phone.lockindail");
+		Bundle bundle = new Bundle();
+		bundle.putString("lock", "reset");
+		lockintent.putExtras(bundle);
+		getApplicationContext().sendBroadcast(lockintent);
+		Log.i("zyc","toggleSpeaker sendBroadcast reset");
     }
 
     /*
@@ -4051,6 +4141,12 @@ public class InCallScreen extends Activity
             if (VTCallUtils.VTScreenMode.VT_SCREEN_OPEN == mVTInCallScreen.getVTScreenMode())
             mVTInCallScreen.updateVTScreen(mVTInCallScreen.getVTScreenMode());
         }
+		Intent lockintent = new Intent("com.android.phone.lockindail");
+		Bundle bundle = new Bundle();
+		bundle.putString("lock", "reset");
+		lockintent.putExtras(bundle);
+		getApplicationContext().sendBroadcast(lockintent);
+		Log.i("zyc","onMuteClick sendBroadcast reset");
     }
 
     /*private*/ void onSpeakerClick() {
@@ -6933,4 +7029,163 @@ public class InCallScreen extends Activity
             Process.setThreadPriority(myId, Process.THREAD_PRIORITY_DEFAULT);
         }
     }
+
+	private LockinDailer mLockinDailer = null;
+	private IntentFilter lockIntentFilter = null;
+	private BroadcastReceiver lockReceiver = null;
+	private String lockAction = "com.android.phone.lockindail";
+	private int LOCK_TIME = 3;
+    private class LockinDailer{
+		 private final int MESSAGE_ID = 1; 
+		 private int lock_count = 0; 
+		 
+		 lockHander mlockHandler;
+		 lockThread mlockThread;
+		 
+		 public LockinDailer() {
+			 Log.i(LOG_TAG, "LockinDailer->construct");
+			 lock_count = 0;
+			 mlockHandler = new lockHander();
+			 mlockThread = new lockThread();
+
+		}
+		 
+		 public void start_lockThread(){
+			 Log.i(LOG_TAG, "LockinDailer->star_lockThread");
+			 mlockThread.start();		 
+    	 } 
+		 
+		 public void interrupted_lockThread(){
+			 Log.i(LOG_TAG, "LockinDailer->interrupted_lockThread");
+			 if(mlockThread.isAlive())
+				 mlockThread.interrupt();
+			 
+    	 } 
+		 
+		 public void reset_lock_time(){
+			 Log.i(LOG_TAG, "LockinDailer->reset_lock_time,lock_count= "+lock_count);
+    		 lock_count = 0;
+    	 }
+		 
+		 private class  lockHander extends Handler{
+		        // @Override   
+		      public void handleMessage(Message msg)  
+	          {  
+	              switch (msg.what)  
+	              {  
+	              case MESSAGE_ID: 
+	            	  if(lock_count >= LOCK_TIME)
+	            	  {
+						reset_lock_time();
+						interrupted_lockThread();
+						Log.i(LOG_TAG, "LockinDailer->startlockactivity,lock_count="+lock_count);
+						
+						Intent lockintent = new Intent(lockAction);
+						Bundle bundle = new Bundle();
+						bundle.putString("lock", "stop");
+						lockintent.putExtras(bundle);
+						sendBroadcast(lockintent);
+						if(LOCK_TIME != 5){
+							LOCK_TIME = 5;
+						}
+						Intent mIntent = new Intent(InCallScreen.this, LockinDailerActivity.class);
+						startActivity(mIntent);
+	            	  }
+	            	  else
+	            	  {
+	            		  Log.i(LOG_TAG, "handleMessage,lock_count="+lock_count);
+	            		  lock_count++;
+	            	  }
+	                  break;  
+	      
+	              }   
+	          }
+		 }	    
+		 
+		 private class lockThread extends Thread{
+
+			@Override
+			public void run() {
+				while(true)
+				{
+					try {
+						sleep(1000);
+					}
+					catch ( InterruptedException e) {
+						return;
+					}
+					
+					Message msg = new Message();
+					msg.what = MESSAGE_ID;
+					mlockHandler.sendMessage(msg);
+				}
+				
+			}	  
+			 
+		 }    	 
+    }	
+	
+	private	class CloseLockActivityReceiver extends BroadcastReceiver{
+		@Override
+		public void onReceive(Context context, Intent intent) {
+			String action = intent.getAction();
+			if (action.equals(lockAction)){
+				Bundle bundle = intent.getExtras();
+				String lockString = bundle.getString("lock");
+				Log.i("zyc","CloseLockActivityReceiver lock = " + lockString);
+				Phone.State state = mCM.getState();
+				if(lockString.equals("start")){
+					if(mLockinDailer == null){
+						mLockinDailer = new LockinDailer();
+						mLockinDailer.reset_lock_time();
+						mLockinDailer.start_lockThread();
+						//aeon panhongyu 20121203
+						if(mIsForegroundActivity == false || mVTInCallScreen.getVTScreenMode() == VTCallUtils.VTScreenMode.VT_SCREEN_OPEN){
+						//aeon panhongyu 20121203
+							Intent lockintent = new Intent(lockAction);
+							Bundle stopbundle = new Bundle();
+							stopbundle.putString("lock", "stop");
+							lockintent.putExtras(stopbundle);
+							sendBroadcast(lockintent);
+							Log.i("zyc","onReceive sendBroadcast stop");							
+						}
+					}
+				}else if(lockString.equals("reset")){
+					if(mLockinDailer != null){
+						mLockinDailer.reset_lock_time();
+					}
+				}else if(lockString.equals("stop")){
+					if(mLockinDailer != null){
+						mLockinDailer.interrupted_lockThread();
+						mLockinDailer = null;
+					}
+				}
+			}else if(action.equals(Intent.ACTION_SCREEN_ON)){
+				Intent lockintent = new Intent(lockAction);
+				Bundle stopbundle = new Bundle();
+				stopbundle.putString("lock", "start");
+				lockintent.putExtras(stopbundle);
+				sendBroadcast(lockintent);
+				Log.i("zyc","ACTION_SCREEN_ON sendBroadcast start");	
+			}else if(action.equals(Intent.ACTION_SCREEN_OFF)){
+				Intent lockintent = new Intent(lockAction);
+				Bundle stopbundle = new Bundle();
+				stopbundle.putString("lock", "stop");
+				lockintent.putExtras(stopbundle);
+				sendBroadcast(lockintent);
+				Log.i("zyc","ACTION_SCREEN_OFF sendBroadcast stop");	
+			}
+		}
+	}
+	
+	private IntentFilter getLockIntentFilter(){
+		if(lockIntentFilter == null){
+			lockIntentFilter = new IntentFilter();
+			lockIntentFilter.addAction(lockAction);
+			lockIntentFilter.addAction(Intent.ACTION_SCREEN_ON);
+			lockIntentFilter.addAction(Intent.ACTION_SCREEN_OFF);
+		}
+		return lockIntentFilter;
+	}
+	
 }



+++ b/alps/packages/apps/Phone/src/com/android/phone/LockinDailerActivity.java






+++ b/alps/packages/apps/Phone/AndroidManifest.xml
@@ -805,6 +805,15 @@
                   android:theme="@*android:style/Theme.Holo.Dialog.Alert">
         </activity>
 
+
+	<activity android:name="LockinDailerActivity"
+		  android:configChanges="orientation"
+                  android:theme="@style/transparent">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+            </intent-filter>                  
+        </activity>
+
         <service android:name="PhoneRecorderServices"></service>
 	<provider android:name=".CallRejectContentProvider" android:authorities="reject" />
     </application>




阅读(253) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~