commit 49d3063737d87db08473699bd19f1fa88fb52c0a Author: Yegor Vyalov Date: Tue Feb 2 15:10:29 2016 +0200 Initial import of version 0.1 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..bdb0cab --- /dev/null +++ b/.gitattributes @@ -0,0 +1,17 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..32446ff --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +*.iml +.gradle +/local.properties +.idea/ +.DS_Store +/build +/captures diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..4763a23 --- /dev/null +++ b/app/build.gradle @@ -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' +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..c8c5501 --- /dev/null +++ b/app/proguard-rules.pro @@ -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 *; +#} diff --git a/app/src/androidTest/java/com/keyboard_crumbs/xiaomiantsalarmservice/ApplicationTest.java b/app/src/androidTest/java/com/keyboard_crumbs/xiaomiantsalarmservice/ApplicationTest.java new file mode 100644 index 0000000..0afd55c --- /dev/null +++ b/app/src/androidTest/java/com/keyboard_crumbs/xiaomiantsalarmservice/ApplicationTest.java @@ -0,0 +1,13 @@ +package com.keyboard_crumbs.xiaomiantsalarmservice; + +import android.app.Application; +import android.test.ApplicationTestCase; + +/** + * Testing Fundamentals + */ +public class ApplicationTest extends ApplicationTestCase { + public ApplicationTest() { + super(Application.class); + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..3315cc4 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/java/com/keyboard_crumbs/xiaomiantsalarmservice/AlarmActivity.java b/app/src/main/java/com/keyboard_crumbs/xiaomiantsalarmservice/AlarmActivity.java new file mode 100644 index 0000000..d1e68c6 --- /dev/null +++ b/app/src/main/java/com/keyboard_crumbs/xiaomiantsalarmservice/AlarmActivity.java @@ -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); + } +} diff --git a/app/src/main/java/com/keyboard_crumbs/xiaomiantsalarmservice/AntsNotificationsService.java b/app/src/main/java/com/keyboard_crumbs/xiaomiantsalarmservice/AntsNotificationsService.java new file mode 100644 index 0000000..b7695a2 --- /dev/null +++ b/app/src/main/java/com/keyboard_crumbs/xiaomiantsalarmservice/AntsNotificationsService.java @@ -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); + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/keyboard_crumbs/xiaomiantsalarmservice/MainActivity.java b/app/src/main/java/com/keyboard_crumbs/xiaomiantsalarmservice/MainActivity.java new file mode 100644 index 0000000..9860b63 --- /dev/null +++ b/app/src/main/java/com/keyboard_crumbs/xiaomiantsalarmservice/MainActivity.java @@ -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(); + } + + +} diff --git a/app/src/main/res/layout/activity_alarm.xml b/app/src/main/res/layout/activity_alarm.xml new file mode 100644 index 0000000..808f911 --- /dev/null +++ b/app/src/main/res/layout/activity_alarm.xml @@ -0,0 +1,50 @@ + + + + + + + + + + +