Initial import of version 0.1
This commit is contained in:
		
							
								
								
									
										1
									
								
								app/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								app/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| /build | ||||
							
								
								
									
										28
									
								
								app/build.gradle
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								app/build.gradle
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| apply plugin: 'com.android.application' | ||||
|  | ||||
| android { | ||||
|     compileSdkVersion 23 | ||||
|     buildToolsVersion "23.0.2" | ||||
|     defaultConfig { | ||||
|         applicationId "com.keyboard_crumbs.xiaomiantsalarmservice" | ||||
|         minSdkVersion 23 | ||||
|         targetSdkVersion 23 | ||||
|         versionCode 1 | ||||
|         versionName "1.0" | ||||
|     } | ||||
|     buildTypes { | ||||
|         release { | ||||
|             minifyEnabled false | ||||
|             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' | ||||
|         } | ||||
|     } | ||||
|     productFlavors { | ||||
|     } | ||||
| } | ||||
|  | ||||
| dependencies { | ||||
|     compile fileTree(dir: 'libs', include: ['*.jar']) | ||||
|     testCompile 'junit:junit:4.12' | ||||
|     compile 'com.android.support:appcompat-v7:23.1.1' | ||||
|     compile 'com.android.support:support-v4:23.1.1' | ||||
| } | ||||
							
								
								
									
										17
									
								
								app/proguard-rules.pro
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								app/proguard-rules.pro
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| # Add project specific ProGuard rules here. | ||||
| # By default, the flags in this file are appended to flags specified | ||||
| # in C:\Users\yegorv\AppData\Local\Android\sdk/tools/proguard/proguard-android.txt | ||||
| # You can edit the include path and order by changing the proguardFiles | ||||
| # directive in build.gradle. | ||||
| # | ||||
| # For more details, see | ||||
| #   http://developer.android.com/guide/developing/tools/proguard.html | ||||
|  | ||||
| # Add any project specific keep options here: | ||||
|  | ||||
| # If your project uses WebView with JS, uncomment the following | ||||
| # and specify the fully qualified class name to the JavaScript interface | ||||
| # class: | ||||
| #-keepclassmembers class fqcn.of.javascript.interface.for.webview { | ||||
| #   public *; | ||||
| #} | ||||
| @@ -0,0 +1,13 @@ | ||||
| package com.keyboard_crumbs.xiaomiantsalarmservice; | ||||
|  | ||||
| import android.app.Application; | ||||
| import android.test.ApplicationTestCase; | ||||
|  | ||||
| /** | ||||
|  * <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a> | ||||
|  */ | ||||
| public class ApplicationTest extends ApplicationTestCase<Application> { | ||||
|     public ApplicationTest() { | ||||
|         super(Application.class); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										42
									
								
								app/src/main/AndroidManifest.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								app/src/main/AndroidManifest.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     package="com.keyboard_crumbs.xiaomiantsalarmservice" | ||||
|     android:versionCode="1" | ||||
|     android:versionName="0.1"> | ||||
|  | ||||
|     <uses-permission android:name="android.permission.VIBRATE" /> | ||||
|     <uses-permission android:name="android.permission.INTERNET" /> | ||||
|  | ||||
|     <application | ||||
|         android:allowBackup="true" | ||||
|         android:icon="@mipmap/ic_launcher" | ||||
|         android:label="@string/app_name" | ||||
|         android:supportsRtl="true" | ||||
|         android:theme="@style/AppTheme"> | ||||
|         <activity | ||||
|             android:name=".MainActivity" | ||||
|             android:noHistory="true"> | ||||
|             <intent-filter> | ||||
|                 <action android:name="android.intent.action.MAIN" /> | ||||
|                 <category android:name="android.intent.category.LAUNCHER" /> | ||||
|             </intent-filter> | ||||
|         </activity> | ||||
|  | ||||
|         <service | ||||
|             android:name=".AntsNotificationsService" | ||||
|             android:label="@string/service_name" | ||||
|             android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"> | ||||
|             <intent-filter> | ||||
|                 <action android:name="android.service.notification.NotificationListenerService" /> | ||||
|             </intent-filter> | ||||
|         </service> | ||||
|  | ||||
|         <activity | ||||
|             android:name=".AlarmActivity" | ||||
|             android:configChanges="orientation|keyboardHidden|screenSize" | ||||
|             android:label="@string/title_activity_alarm" | ||||
|             android:theme="@style/FullscreenTheme" /> | ||||
|  | ||||
|     </application> | ||||
|  | ||||
| </manifest> | ||||
| @@ -0,0 +1,206 @@ | ||||
| package com.keyboard_crumbs.xiaomiantsalarmservice; | ||||
|  | ||||
| import android.annotation.SuppressLint; | ||||
| import android.content.Context; | ||||
| import android.content.SharedPreferences; | ||||
| import android.media.MediaPlayer; | ||||
| import android.media.Ringtone; | ||||
| import android.media.RingtoneManager; | ||||
| import android.net.Uri; | ||||
| import android.os.Vibrator; | ||||
| import android.provider.Settings; | ||||
| import android.support.v7.app.ActionBar; | ||||
| import android.support.v7.app.AppCompatActivity; | ||||
| import android.os.Bundle; | ||||
| import android.os.Handler; | ||||
| import android.view.MotionEvent; | ||||
| import android.view.View; | ||||
| import android.widget.TextView; | ||||
|  | ||||
| /** | ||||
|  * An example full-screen activity that shows and hides the system UI (i.e. | ||||
|  * status bar and navigation/system bar) with user interaction. | ||||
|  */ | ||||
| public class AlarmActivity extends AppCompatActivity { | ||||
|  | ||||
|     private Uri notification; | ||||
|     private Ringtone ringtone; | ||||
|  | ||||
|     /** | ||||
|      * Whether or not the system UI should be auto-hidden after | ||||
|      * {@link #AUTO_HIDE_DELAY_MILLIS} milliseconds. | ||||
|      */ | ||||
|     private static final boolean AUTO_HIDE = true; | ||||
|  | ||||
|     /** | ||||
|      * If {@link #AUTO_HIDE} is set, the number of milliseconds to wait after | ||||
|      * user interaction before hiding the system UI. | ||||
|      */ | ||||
|     private static final int AUTO_HIDE_DELAY_MILLIS = 3000; | ||||
|     private long[] vibratorPattern = { 0, 500, 500 }; | ||||
|  | ||||
|     /** | ||||
|      * Some older devices needs a small delay between UI widget updates | ||||
|      * and a change of the status and navigation bar. | ||||
|      */ | ||||
|     private static final int UI_ANIMATION_DELAY = 300; | ||||
|     private final Handler mHideHandler = new Handler(); | ||||
|     private View mContentView; | ||||
|     private Vibrator vibrator; | ||||
|     private SharedPreferences settings; | ||||
|     private final Runnable mHidePart2Runnable = new Runnable() { | ||||
|         @SuppressLint("InlinedApi") | ||||
|         @Override | ||||
|         public void run() { | ||||
|             // Delayed removal of status and navigation bar | ||||
|  | ||||
|             // Note that some of these constants are new as of API 16 (Jelly Bean) | ||||
|             // and API 19 (KitKat). It is safe to use them, as they are inlined | ||||
|             // at compile-time and do nothing on earlier devices. | ||||
|             mContentView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE | ||||
|                     | View.SYSTEM_UI_FLAG_FULLSCREEN | ||||
|                     | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | ||||
|                     | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | ||||
|                     | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | ||||
|                     | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION); | ||||
|         } | ||||
|     }; | ||||
|     private View mControlsView; | ||||
|     private final Runnable mShowPart2Runnable = new Runnable() { | ||||
|         @Override | ||||
|         public void run() { | ||||
|             // Delayed display of UI elements | ||||
|             ActionBar actionBar = getSupportActionBar(); | ||||
|             if (actionBar != null) { | ||||
|                 actionBar.show(); | ||||
|             } | ||||
|             mControlsView.setVisibility(View.VISIBLE); | ||||
|         } | ||||
|     }; | ||||
|     private boolean mVisible; | ||||
|     private final Runnable mHideRunnable = new Runnable() { | ||||
|         @Override | ||||
|         public void run() { | ||||
|             hide(); | ||||
|         } | ||||
|     }; | ||||
|     /** | ||||
|      * Touch listener to use for in-layout UI controls to delay hiding the | ||||
|      * system UI. This is to prevent the jarring behavior of controls going away | ||||
|      * while interacting with activity UI. | ||||
|      */ | ||||
|     private final View.OnTouchListener mDelayHideTouchListener = new View.OnTouchListener() { | ||||
|         @Override | ||||
|         public boolean onTouch(View view, MotionEvent motionEvent) { | ||||
|             if (AUTO_HIDE) { | ||||
|                 delayedHide(AUTO_HIDE_DELAY_MILLIS); | ||||
|             } | ||||
|             return false; | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     private final View.OnTouchListener mButtonTouchListener = new View.OnTouchListener() { | ||||
|         @Override | ||||
|         public boolean onTouch(View view, MotionEvent motionEvent) { | ||||
|             ringtone.stop(); | ||||
|             vibrator.cancel(); | ||||
|             finish(); | ||||
|             return false; | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|  | ||||
|     @Override | ||||
|     protected void onStart() { | ||||
|         super.onStart(); | ||||
|         Bundle b = getIntent().getExtras(); | ||||
|         ((TextView)mContentView).setText(b.getString("text")); | ||||
|         ringtone.play(); | ||||
|         if (settings.getBoolean("vibrate",false)) { | ||||
|             vibrator.vibrate(vibratorPattern, 0); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected void onCreate(Bundle savedInstanceState) { | ||||
|         super.onCreate(savedInstanceState); | ||||
|  | ||||
|         setContentView(R.layout.activity_alarm); | ||||
|  | ||||
|         mVisible = true; | ||||
|         mControlsView = findViewById(R.id.fullscreen_content_controls); | ||||
|         mContentView = findViewById(R.id.fullscreen_content); | ||||
|  | ||||
|  | ||||
|         // Set up the user interaction to manually show or hide the system UI. | ||||
|         mContentView.setOnClickListener(new View.OnClickListener() { | ||||
|             @Override | ||||
|             public void onClick(View view) { | ||||
|                 toggle(); | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|         // Upon interacting with UI controls, delay any scheduled hide() | ||||
|         // operations to prevent the jarring behavior of controls going away | ||||
|         // while interacting with the UI. | ||||
|         findViewById(R.id.dummy_button).setOnTouchListener(mButtonTouchListener); | ||||
|         notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE); | ||||
|         ringtone = RingtoneManager.getRingtone(getApplicationContext(), notification); | ||||
|         vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); | ||||
|         settings = getApplicationContext().getSharedPreferences("settings", 0); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected void onPostCreate(Bundle savedInstanceState) { | ||||
|         super.onPostCreate(savedInstanceState); | ||||
|  | ||||
|         // Trigger the initial hide() shortly after the activity has been | ||||
|         // created, to briefly hint to the user that UI controls | ||||
|         // are available. | ||||
|         delayedHide(100); | ||||
|     } | ||||
|  | ||||
|     private void toggle() { | ||||
|         if (mVisible) { | ||||
|             hide(); | ||||
|         } else { | ||||
|             show(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void hide() { | ||||
|         // Hide UI first | ||||
|         ActionBar actionBar = getSupportActionBar(); | ||||
|         if (actionBar != null) { | ||||
|             actionBar.hide(); | ||||
|         } | ||||
|         mControlsView.setVisibility(View.GONE); | ||||
|         mVisible = false; | ||||
|  | ||||
|         // Schedule a runnable to remove the status and navigation bar after a delay | ||||
|         mHideHandler.removeCallbacks(mShowPart2Runnable); | ||||
|         mHideHandler.postDelayed(mHidePart2Runnable, UI_ANIMATION_DELAY); | ||||
|     } | ||||
|  | ||||
|     @SuppressLint("InlinedApi") | ||||
|     private void show() { | ||||
|         // Show the system bar | ||||
|         mContentView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | ||||
|                 | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); | ||||
|         mVisible = true; | ||||
|  | ||||
|         // Schedule a runnable to display UI elements after a delay | ||||
|         mHideHandler.removeCallbacks(mHidePart2Runnable); | ||||
|         mHideHandler.postDelayed(mShowPart2Runnable, UI_ANIMATION_DELAY); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Schedules a call to hide() in [delay] milliseconds, canceling any | ||||
|      * previously scheduled calls. | ||||
|      */ | ||||
|     private void delayedHide(int delayMillis) { | ||||
|         mHideHandler.removeCallbacks(mHideRunnable); | ||||
|         mHideHandler.postDelayed(mHideRunnable, delayMillis); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,65 @@ | ||||
| package com.keyboard_crumbs.xiaomiantsalarmservice; | ||||
|  | ||||
| import android.app.NotificationManager; | ||||
| import android.content.BroadcastReceiver; | ||||
| import android.content.Context; | ||||
| import android.content.Intent; | ||||
| import android.content.IntentFilter; | ||||
| import android.content.SharedPreferences; | ||||
| import android.os.Bundle; | ||||
| import android.service.notification.NotificationListenerService; | ||||
| import android.service.notification.StatusBarNotification; | ||||
| import android.support.v7.app.NotificationCompat; | ||||
| import android.telephony.PhoneNumberUtils; | ||||
| import android.util.Log; | ||||
|  | ||||
| import java.io.ByteArrayOutputStream; | ||||
| import java.lang.reflect.Method; | ||||
| import java.util.Calendar; | ||||
| import java.util.GregorianCalendar; | ||||
|  | ||||
| public class AntsNotificationsService extends NotificationListenerService { | ||||
|  | ||||
|     private String TAG = this.getClass().getSimpleName(); | ||||
|     private SharedPreferences settings; | ||||
|  | ||||
|     @Override | ||||
|     public void onCreate() { | ||||
|         super.onCreate(); | ||||
|         settings = getApplicationContext().getSharedPreferences("settings", 0); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onDestroy() { | ||||
|         super.onDestroy(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onNotificationPosted(StatusBarNotification sbn) { | ||||
|         if (settings.getBoolean("enable", false)) { | ||||
|             if (sbn.getPackageName().equals("com.ants360.yicamera")) { | ||||
|                 //Log.i(TAG, sbn.getNotification().extras.getString("android.title")); | ||||
|                 Intent dialogIntent = new Intent(this, AlarmActivity.class); | ||||
|                 dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); | ||||
|                 Bundle b = new Bundle(); | ||||
|                 b.putString("text", sbn.getNotification().extras.getString("android.title")); | ||||
|                 dialogIntent.putExtras(b); | ||||
|                 if (settings.getBoolean("removeNotification", false)) { | ||||
|                     cancelNotification(sbn.getKey()); | ||||
|                 } | ||||
|                 startActivity(dialogIntent); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onNotificationRemoved(StatusBarNotification sbn) { | ||||
|        /* Log.i(TAG,"********** onNOtificationRemoved"); | ||||
|         Log.i(TAG, "ID :" + sbn.getId() + "\t" + sbn.getNotification().tickerText + "\t" + sbn.getPackageName()); | ||||
|         Intent i = new  Intent("com.keyboard_crumbs.xiaomiantsalarmservice.NOTIFICATION_LISTENER_SERVICE"); | ||||
|         i.putExtra("notification_event", "onNotificationRemoved :" + sbn.getPackageName() + "\n");*/ | ||||
|  | ||||
|         //sendBroadcast(i); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,96 @@ | ||||
| package com.keyboard_crumbs.xiaomiantsalarmservice; | ||||
|  | ||||
| import android.content.BroadcastReceiver; | ||||
| import android.content.Context; | ||||
| import android.content.Intent; | ||||
| import android.content.IntentFilter; | ||||
| import android.content.SharedPreferences; | ||||
| import android.net.Uri; | ||||
| import android.support.v4.content.LocalBroadcastManager; | ||||
| import android.support.v7.app.AppCompatActivity; | ||||
| import android.os.Bundle; | ||||
| import android.view.View; | ||||
| import android.widget.Button; | ||||
| import android.widget.CompoundButton; | ||||
| import android.widget.EditText; | ||||
| import android.widget.Switch; | ||||
|  | ||||
| public class MainActivity extends AppCompatActivity { | ||||
|  | ||||
|     private SharedPreferences settings; | ||||
|     SharedPreferences.Editor editor; | ||||
|     private Switch enableSwitch; | ||||
|     private Switch removeNotiSwitch; | ||||
|     private Switch vibrateSwitch; | ||||
|     private Button btnTest; | ||||
|     private Intent dialogIntent; | ||||
|  | ||||
|     @Override | ||||
|     protected void onCreate(Bundle savedInstanceState) { | ||||
|         super.onCreate(savedInstanceState); | ||||
|  | ||||
|         setContentView(R.layout.activity_main); | ||||
|         btnTest = (Button)findViewById(R.id.btnTestAlarm); | ||||
|         enableSwitch = (Switch)findViewById(R.id.switch1); | ||||
|         removeNotiSwitch = (Switch)findViewById(R.id.switch2); | ||||
|         vibrateSwitch = (Switch)findViewById(R.id.switch3); | ||||
|  | ||||
|         settings = getApplicationContext().getSharedPreferences("settings", 0); | ||||
|         editor = settings.edit(); | ||||
|  | ||||
|         dialogIntent = new Intent(this, AlarmActivity.class); | ||||
|  | ||||
|         btnTest.setOnClickListener(onClickListener); | ||||
|  | ||||
|         enableSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | ||||
|             public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | ||||
|                 editor.putBoolean("enable", isChecked); | ||||
|                 editor.apply(); | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|         removeNotiSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | ||||
|             public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | ||||
|                 editor.putBoolean("removeNotification", isChecked); | ||||
|                 editor.apply(); | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|         vibrateSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | ||||
|             public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | ||||
|                 editor.putBoolean("vibrate", isChecked); | ||||
|                 editor.apply(); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|    @Override | ||||
|     protected void onStart() { | ||||
|         super.onStart(); | ||||
|         enableSwitch.setChecked(settings.getBoolean("enable", false)); | ||||
|         removeNotiSwitch.setChecked(settings.getBoolean("removeNotification", false)); | ||||
|         vibrateSwitch.setChecked(settings.getBoolean("vibrate", false)); | ||||
|     } | ||||
|  | ||||
|     private View.OnClickListener onClickListener = new View.OnClickListener() { | ||||
|         @Override | ||||
|         public void onClick(final View v) { | ||||
|             switch(v.getId()){ | ||||
|                 case R.id.btnTestAlarm: | ||||
|                     dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); | ||||
|                     Bundle b = new Bundle(); | ||||
|                     b.putString("text", "Test Notification"); | ||||
|                     dialogIntent.putExtras(b); | ||||
|                     startActivity(dialogIntent); | ||||
|                     break; | ||||
|             } | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     @Override | ||||
|     protected void onDestroy() { | ||||
|         super.onDestroy(); | ||||
|     } | ||||
|  | ||||
|  | ||||
| } | ||||
							
								
								
									
										50
									
								
								app/src/main/res/layout/activity_alarm.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								app/src/main/res/layout/activity_alarm.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | ||||
| <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:tools="http://schemas.android.com/tools" | ||||
|     android:layout_width="match_parent" | ||||
|     android:layout_height="match_parent" | ||||
|     android:background="#0099cc" | ||||
|     tools:context="com.keyboard_crumbs.xiaomiantsalarmservice.AlarmActivity"> | ||||
|  | ||||
|     <!-- The primary full-screen view. This can be replaced with whatever view | ||||
|          is needed to present your content, e.g. VideoView, SurfaceView, | ||||
|          TextureView, etc. --> | ||||
|     <TextView | ||||
|         android:id="@+id/fullscreen_content" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="match_parent" | ||||
|         android:gravity="center" | ||||
|         android:keepScreenOn="true" | ||||
|         android:text="HHH" | ||||
|         android:textColor="#33b5e5" | ||||
|         android:textSize="50sp" | ||||
|         android:textStyle="bold" /> | ||||
|  | ||||
|     <!-- This FrameLayout insets its children based on system windows using | ||||
|          android:fitsSystemWindows. --> | ||||
|     <FrameLayout | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="match_parent" | ||||
|         android:fitsSystemWindows="true"> | ||||
|  | ||||
|         <LinearLayout | ||||
|             android:id="@+id/fullscreen_content_controls" | ||||
|             style="?metaButtonBarStyle" | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:layout_gravity="bottom|center_horizontal" | ||||
|             android:background="@color/black_overlay" | ||||
|             android:orientation="horizontal" | ||||
|             tools:ignore="UselessParent"> | ||||
|  | ||||
|             <Button | ||||
|                 android:id="@+id/dummy_button" | ||||
|                 style="?metaButtonBarButtonStyle" | ||||
|                 android:layout_width="0dp" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:layout_weight="1" | ||||
|                 android:text="@string/dummy_button" /> | ||||
|  | ||||
|         </LinearLayout> | ||||
|     </FrameLayout> | ||||
|  | ||||
| </FrameLayout> | ||||
							
								
								
									
										48
									
								
								app/src/main/res/layout/activity_main.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								app/src/main/res/layout/activity_main.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:tools="http://schemas.android.com/tools" | ||||
|     android:layout_width="match_parent" | ||||
|     android:layout_height="match_parent" | ||||
|     android:paddingBottom="@dimen/activity_vertical_margin" | ||||
|     android:paddingLeft="@dimen/activity_horizontal_margin" | ||||
|     android:paddingRight="@dimen/activity_horizontal_margin" | ||||
|     android:paddingTop="@dimen/activity_vertical_margin" | ||||
|     tools:context="com.keyboard_crumbs.xiaomiantsalarmservice.MainActivity"> | ||||
|  | ||||
|     <Switch | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:text="@string/enable_alarm" | ||||
|         android:id="@+id/switch1" | ||||
|         android:layout_alignParentTop="true" | ||||
|         android:layout_alignParentEnd="true" | ||||
|         android:layout_alignParentStart="true" | ||||
|         android:checked="false" /> | ||||
|  | ||||
|     <Switch | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:text="@string/remove_main_notification" | ||||
|         android:id="@+id/switch2" | ||||
|         android:layout_below="@+id/switch1" | ||||
|         android:layout_alignParentStart="true" | ||||
|         android:layout_alignEnd="@+id/switch1" /> | ||||
|  | ||||
|     <Button | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:text="@string/test_alarm" | ||||
|         android:id="@+id/btnTestAlarm" | ||||
|         android:layout_alignParentBottom="true" | ||||
|         android:layout_centerHorizontal="true" /> | ||||
|  | ||||
|     <Switch | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:text="@string/vibrate" | ||||
|         android:id="@+id/switch3" | ||||
|         android:layout_below="@+id/switch2" | ||||
|         android:layout_alignParentStart="true" | ||||
|         android:layout_alignParentEnd="true" /> | ||||
|  | ||||
| </RelativeLayout> | ||||
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/mipmap-hdpi/ic_launcher.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								app/src/main/res/mipmap-hdpi/ic_launcher.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 22 KiB | 
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/mipmap-mdpi/ic_launcher.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								app/src/main/res/mipmap-mdpi/ic_launcher.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 20 KiB | 
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/mipmap-xhdpi/ic_launcher.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								app/src/main/res/mipmap-xhdpi/ic_launcher.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 24 KiB | 
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/mipmap-xxhdpi/ic_launcher.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								app/src/main/res/mipmap-xxhdpi/ic_launcher.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 30 KiB | 
							
								
								
									
										
											BIN
										
									
								
								app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 35 KiB | 
							
								
								
									
										6
									
								
								app/src/main/res/values-w820dp/dimens.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								app/src/main/res/values-w820dp/dimens.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| <resources> | ||||
|     <!-- Example customization of dimensions originally defined in res/values/dimens.xml | ||||
|          (such as screen margins) for screens with more than 820dp of available width. This | ||||
|          would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). --> | ||||
|     <dimen name="activity_horizontal_margin">64dp</dimen> | ||||
| </resources> | ||||
							
								
								
									
										12
									
								
								app/src/main/res/values/attrs.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								app/src/main/res/values/attrs.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| <resources> | ||||
|  | ||||
|     <!-- Declare custom theme attributes that allow changing which styles are | ||||
|          used for button bars depending on the API level. | ||||
|          ?android:attr/buttonBarStyle is new as of API 11 so this is | ||||
|          necessary to support previous API levels. --> | ||||
|     <declare-styleable name="ButtonBarContainerTheme"> | ||||
|         <attr name="metaButtonBarStyle" format="reference" /> | ||||
|         <attr name="metaButtonBarButtonStyle" format="reference" /> | ||||
|     </declare-styleable> | ||||
|  | ||||
| </resources> | ||||
							
								
								
									
										8
									
								
								app/src/main/res/values/colors.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								app/src/main/res/values/colors.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <resources> | ||||
|     <color name="colorPrimary">#3F51B5</color> | ||||
|     <color name="colorPrimaryDark">#303F9F</color> | ||||
|     <color name="colorAccent">#FF4081</color> | ||||
|  | ||||
|     <color name="black_overlay">#66000000</color> | ||||
| </resources> | ||||
							
								
								
									
										5
									
								
								app/src/main/res/values/dimens.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								app/src/main/res/values/dimens.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| <resources> | ||||
|     <!-- Default screen margins, per the Android Design guidelines. --> | ||||
|     <dimen name="activity_horizontal_margin">16dp</dimen> | ||||
|     <dimen name="activity_vertical_margin">16dp</dimen> | ||||
| </resources> | ||||
							
								
								
									
										17
									
								
								app/src/main/res/values/strings.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								app/src/main/res/values/strings.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| <resources> | ||||
|     <string name="app_name">Xiaomi Ants Alarm Service</string> | ||||
|     <string name="service_name">Xiaomi Ants Listener</string> | ||||
|  | ||||
|     <string name="title_activity_alarm">Camera movement Detected!</string> | ||||
|     <string name="dummy_button">Close</string> | ||||
|     <string name="dummy_content">DUMMY\nCONTENT</string> | ||||
|     <string name="enable_alarm">Enable fullscreen alarm</string> | ||||
|     <string name="remove_main_notification">Remove Xiaomi app notification</string> | ||||
|     <string name="test_alarm">Test Alarm</string> | ||||
|     <string name="vibrate">Vibrate</string> | ||||
|     <string name="enable_wan_monitor">Run WAN monitor</string> | ||||
|     <string name="wan_monitor_stopped">WAN monitor stopped</string> | ||||
|     <string name="wan_monitor_started">WAN monitor started</string> | ||||
|     <string name="primary_wan_is_ok">Primary WAN is OK</string> | ||||
|     <string name="primary_wan_isnt_reachable">Primary WAN isnt reachable!</string> | ||||
| </resources> | ||||
							
								
								
									
										23
									
								
								app/src/main/res/values/styles.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								app/src/main/res/values/styles.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| <resources> | ||||
|  | ||||
|     <!-- Base application theme. --> | ||||
|     <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> | ||||
|         <!-- Customize your theme here. --> | ||||
|         <item name="colorPrimary">@color/colorPrimary</item> | ||||
|         <item name="colorPrimaryDark">@color/colorPrimaryDark</item> | ||||
|         <item name="colorAccent">@color/colorAccent</item> | ||||
|     </style> | ||||
|  | ||||
|     <style name="FullscreenTheme" parent="AppTheme"> | ||||
|         <item name="android:actionBarStyle">@style/FullscreenActionBarStyle</item> | ||||
|         <item name="android:windowActionBarOverlay">true</item> | ||||
|         <item name="android:windowBackground">@null</item> | ||||
|         <item name="metaButtonBarStyle">?android:attr/buttonBarStyle</item> | ||||
|         <item name="metaButtonBarButtonStyle">?android:attr/buttonBarButtonStyle</item> | ||||
|     </style> | ||||
|  | ||||
|     <style name="FullscreenActionBarStyle" parent="Widget.AppCompat.ActionBar"> | ||||
|         <item name="android:background">@color/black_overlay</item> | ||||
|     </style> | ||||
|  | ||||
| </resources> | ||||
| @@ -0,0 +1,15 @@ | ||||
| package com.keyboard_crumbs.xiaomiantsalarmservice; | ||||
|  | ||||
| import org.junit.Test; | ||||
|  | ||||
| import static org.junit.Assert.*; | ||||
|  | ||||
| /** | ||||
|  * To work on unit tests, switch the Test Artifact in the Build Variants view. | ||||
|  */ | ||||
| public class ExampleUnitTest { | ||||
|     @Test | ||||
|     public void addition_isCorrect() throws Exception { | ||||
|         assertEquals(4, 2 + 2); | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user