diff --git a/README.md b/README.md index d66b265..8822dd0 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ To API Level 14 or later are supported [SimpleFloating](http://youtu.be/nb8M2p0agF4) ## Requirements -Target Sdk Version : 25 +Target Sdk Version : 26 Min Sdk Version : 14 ## How to use @@ -69,6 +69,7 @@ Describe the process (`onFinishFloatingView`) that is called when you exit the F ``` 6) Define the Service to AndroidManifest + example) ```java @@ -81,10 +82,26 @@ example) ``` -7) Describe the process to start the Service (example of Fragment) +7) Describe the process to start the Service (run on foreground) ```java - final Activity activity = getActivity(); - activity.startService(new Intent(activity, ChatHeadService.class)); + final Intent intent = new Intent(activity, ChatHeadService.class); + ContextCompat.startForegroundService(activity, intent); +``` + +8) Create notification channel (targetSdkVersion >= 26) + +example) +```java +if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + final String channelId = getString(R.string.default_floatingview_channel_id); + final String channelName = getString(R.string.default_floatingview_channel_name); + final NotificationChannel defaultChannel = new NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_MIN); + final NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); + if (manager != null) { + manager.createNotificationChannel(defaultChannel); + } +} + ``` ## Static Options diff --git a/build.gradle b/build.gradle index bdd76f4..38f9ac3 100644 --- a/build.gradle +++ b/build.gradle @@ -3,9 +3,10 @@ buildscript { repositories { jcenter() + google() } dependencies { - classpath 'com.android.tools.build:gradle:2.3.3' + classpath 'com.android.tools.build:gradle:3.0.0' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -16,12 +17,13 @@ allprojects { repositories { maven { url "https://jitpack.io" } jcenter() + google() } } ext { - compileSdkVersion = 25 - buildToolsVersion = '25.0.2' - targetSdkVersion = 25 + compileSdkVersion = 26 + buildToolsVersion = '26.0.2' + targetSdkVersion = 26 minSdkVersion = 14 } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d71758f..50da505 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Jun 26 10:48:16 JST 2017 +#Wed Sep 13 12:18:11 JST 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip diff --git a/library/build.gradle b/library/build.gradle index 478d397..7471069 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -13,8 +13,8 @@ android { } dependencies { - compile 'com.android.support:support-annotations:25.3.1' - compile 'com.android.support:support-compat:25.3.1' + compile 'com.android.support:support-annotations:26.1.0' + compile 'com.android.support:support-compat:26.1.0' } // build a jar with source files diff --git a/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingView.java b/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingView.java index 7b34dff..a071fba 100644 --- a/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingView.java +++ b/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingView.java @@ -127,6 +127,11 @@ class FloatingView extends FrameLayout implements ViewTreeObserver.OnPreDrawList */ static final int DEFAULT_HEIGHT = ViewGroup.LayoutParams.WRAP_CONTENT; + /** + * Overlay Type + */ + private static final int OVERLAY_TYPE; + /** * WindowManager */ @@ -297,6 +302,14 @@ class FloatingView extends FrameLayout implements ViewTreeObserver.OnPreDrawList */ private int mRotation; + static { + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.N_MR1) { + OVERLAY_TYPE = WindowManager.LayoutParams.TYPE_PRIORITY_PHONE; + } else { + OVERLAY_TYPE = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; + } + } + /** * コンストラクタ * @@ -310,7 +323,7 @@ class FloatingView extends FrameLayout implements ViewTreeObserver.OnPreDrawList mWindowManager.getDefaultDisplay().getMetrics(mMetrics); mParams.width = ViewGroup.LayoutParams.WRAP_CONTENT; mParams.height = ViewGroup.LayoutParams.WRAP_CONTENT; - mParams.type = WindowManager.LayoutParams.TYPE_PRIORITY_PHONE; + mParams.type = OVERLAY_TYPE; mParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; diff --git a/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FullscreenObserverView.java b/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FullscreenObserverView.java index bf7516d..4b77351 100644 --- a/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FullscreenObserverView.java +++ b/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FullscreenObserverView.java @@ -36,6 +36,11 @@ class FullscreenObserverView extends View implements ViewTreeObserver.OnGlobalLa */ static final int NO_LAST_VISIBILITY = -1; + /** + * Overlay Type + */ + private static final int OVERLAY_TYPE; + /** * WindowManager.LayoutParams */ @@ -57,6 +62,13 @@ class FullscreenObserverView extends View implements ViewTreeObserver.OnGlobalLa */ private final Rect mWindowRect; + static { + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.N_MR1) { + OVERLAY_TYPE = WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY; + } else { + OVERLAY_TYPE = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; + } + } /** * コンストラクタ @@ -71,7 +83,7 @@ class FullscreenObserverView extends View implements ViewTreeObserver.OnGlobalLa mParams = new WindowManager.LayoutParams(); mParams.width = 1; mParams.height = ViewGroup.LayoutParams.MATCH_PARENT; - mParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY; + mParams.type = OVERLAY_TYPE; mParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; diff --git a/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/TrashView.java b/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/TrashView.java index 3588c56..8ca2db0 100644 --- a/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/TrashView.java +++ b/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/TrashView.java @@ -100,6 +100,11 @@ class TrashView extends FrameLayout implements ViewTreeObserver.OnPreDrawListene */ private static final int LONG_PRESS_TIMEOUT = ViewConfiguration.getLongPressTimeout(); + /** + * Overlay Type + */ + private static final int OVERLAY_TYPE; + /** * WindowManager */ @@ -180,6 +185,14 @@ class TrashView extends FrameLayout implements ViewTreeObserver.OnPreDrawListene */ private boolean mIsEnabled; + static { + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.N_MR1) { + OVERLAY_TYPE = WindowManager.LayoutParams.TYPE_PRIORITY_PHONE; + } else { + OVERLAY_TYPE = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; + } + } + /** * コンストラクタ * @@ -196,7 +209,7 @@ class TrashView extends FrameLayout implements ViewTreeObserver.OnPreDrawListene mParams = new WindowManager.LayoutParams(); mParams.width = ViewGroup.LayoutParams.MATCH_PARENT; mParams.height = ViewGroup.LayoutParams.MATCH_PARENT; - mParams.type = WindowManager.LayoutParams.TYPE_PRIORITY_PHONE; + mParams.type = OVERLAY_TYPE; mParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; diff --git a/sample/build.gradle b/sample/build.gradle index 63d36a5..7081ee0 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -21,7 +21,6 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:support-v13:25.3.1' - compile 'com.android.support:preference-v14:25.3.1' + compile 'com.android.support:preference-v14:26.1.0' compile project(':library') } diff --git a/sample/src/main/java/jp/co/recruit_lifestyle/sample/MainActivity.java b/sample/src/main/java/jp/co/recruit_lifestyle/sample/MainActivity.java index 231680f..659dec9 100644 --- a/sample/src/main/java/jp/co/recruit_lifestyle/sample/MainActivity.java +++ b/sample/src/main/java/jp/co/recruit_lifestyle/sample/MainActivity.java @@ -2,6 +2,9 @@ import android.app.Activity; import android.app.FragmentTransaction; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.os.Build; import android.os.Bundle; import jp.co.recruit.floatingview.R; @@ -15,6 +18,17 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); + // create default notification channel + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + final String channelId = getString(R.string.default_floatingview_channel_id); + final String channelName = getString(R.string.default_floatingview_channel_name); + final NotificationChannel defaultChannel = new NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_MIN); + final NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); + if (manager != null) { + manager.createNotificationChannel(defaultChannel); + } + } + if (savedInstanceState == null) { FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.add(R.id.container, FloatingViewControlFragment.newInstance()); diff --git a/sample/src/main/java/jp/co/recruit_lifestyle/sample/fragment/FloatingViewControlFragment.java b/sample/src/main/java/jp/co/recruit_lifestyle/sample/fragment/FloatingViewControlFragment.java index af8cb36..58677e7 100644 --- a/sample/src/main/java/jp/co/recruit_lifestyle/sample/fragment/FloatingViewControlFragment.java +++ b/sample/src/main/java/jp/co/recruit_lifestyle/sample/fragment/FloatingViewControlFragment.java @@ -10,6 +10,7 @@ import android.os.Build; import android.os.Bundle; import android.provider.Settings; +import android.support.v4.content.ContextCompat; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -111,13 +112,15 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { private void showChatHead(Context context, boolean isShowOverlayPermission) { // API22以下かチェック if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1) { - context.startService(new Intent(context, ChatHeadService.class)); + final Intent intent = new Intent(context, ChatHeadService.class); + ContextCompat.startForegroundService(context, intent); return; } // 他のアプリの上に表示できるかチェック if (Settings.canDrawOverlays(context)) { - context.startService(new Intent(context, ChatHeadService.class)); + final Intent intent = new Intent(context, ChatHeadService.class); + ContextCompat.startForegroundService(context, intent); return; } @@ -138,13 +141,15 @@ private void showChatHead(Context context, boolean isShowOverlayPermission) { private void showCustomFloatingView(Context context, boolean isShowOverlayPermission) { // API22以下かチェック if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1) { - context.startService(new Intent(context, CustomFloatingViewService.class)); + final Intent intent = new Intent(context, CustomFloatingViewService.class); + ContextCompat.startForegroundService(context, intent); return; } // 他のアプリの上に表示できるかチェック if (Settings.canDrawOverlays(context)) { - context.startService(new Intent(context, CustomFloatingViewService.class)); + final Intent intent = new Intent(context, CustomFloatingViewService.class); + ContextCompat.startForegroundService(context, intent); return; } diff --git a/sample/src/main/java/jp/co/recruit_lifestyle/sample/service/ChatHeadService.java b/sample/src/main/java/jp/co/recruit_lifestyle/sample/service/ChatHeadService.java index fc3910d..d11cd2a 100644 --- a/sample/src/main/java/jp/co/recruit_lifestyle/sample/service/ChatHeadService.java +++ b/sample/src/main/java/jp/co/recruit_lifestyle/sample/service/ChatHeadService.java @@ -68,7 +68,7 @@ public void onClick(View v) { mFloatingViewManager.addViewToWindow(iconView, options); // 常駐起動 - startForeground(NOTIFICATION_ID, createNotification()); + startForeground(NOTIFICATION_ID, createNotification(this)); return START_REDELIVER_INTENT; } @@ -125,12 +125,12 @@ private void destroy() { * 通知を表示します。 * クリック時のアクションはありません。 */ - private Notification createNotification() { - final NotificationCompat.Builder builder = new NotificationCompat.Builder(this); + private static Notification createNotification(Context context) { + final NotificationCompat.Builder builder = new NotificationCompat.Builder(context, context.getString(R.string.default_floatingview_channel_id)); builder.setWhen(System.currentTimeMillis()); builder.setSmallIcon(R.mipmap.ic_launcher); - builder.setContentTitle(getString(R.string.chathead_content_title)); - builder.setContentText(getString(R.string.content_text)); + builder.setContentTitle(context.getString(R.string.chathead_content_title)); + builder.setContentText(context.getString(R.string.content_text)); builder.setOngoing(true); builder.setPriority(NotificationCompat.PRIORITY_MIN); builder.setCategory(NotificationCompat.CATEGORY_SERVICE); diff --git a/sample/src/main/java/jp/co/recruit_lifestyle/sample/service/CustomFloatingViewService.java b/sample/src/main/java/jp/co/recruit_lifestyle/sample/service/CustomFloatingViewService.java index 734689c..cebc2fd 100644 --- a/sample/src/main/java/jp/co/recruit_lifestyle/sample/service/CustomFloatingViewService.java +++ b/sample/src/main/java/jp/co/recruit_lifestyle/sample/service/CustomFloatingViewService.java @@ -13,7 +13,6 @@ import android.support.v4.app.NotificationCompat; import android.text.TextUtils; import android.util.DisplayMetrics; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.WindowManager; @@ -87,7 +86,7 @@ public void onClick(View v) { mFloatingViewManager.addViewToWindow(iconView, options); // 常駐起動 - startForeground(NOTIFICATION_ID, createNotification()); + startForeground(NOTIFICATION_ID, createNotification(this)); return START_REDELIVER_INTENT; } @@ -145,19 +144,19 @@ private void destroy() { /** * 通知を表示します。 */ - private Notification createNotification() { - final NotificationCompat.Builder builder = new NotificationCompat.Builder(this); + private static Notification createNotification(Context context) { + final NotificationCompat.Builder builder = new NotificationCompat.Builder(context, context.getString(R.string.default_floatingview_channel_id)); builder.setWhen(System.currentTimeMillis()); builder.setSmallIcon(R.mipmap.ic_launcher); - builder.setContentTitle(getString(R.string.mail_content_title)); - builder.setContentText(getString(R.string.content_text)); + builder.setContentTitle(context.getString(R.string.mail_content_title)); + builder.setContentText(context.getString(R.string.content_text)); builder.setOngoing(true); builder.setPriority(NotificationCompat.PRIORITY_MIN); builder.setCategory(NotificationCompat.CATEGORY_SERVICE); // PendingIntent作成 - final Intent notifyIntent = new Intent(this, DeleteActionActivity.class); - PendingIntent notifyPendingIntent = PendingIntent.getActivity(this, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT); + final Intent notifyIntent = new Intent(context, DeleteActionActivity.class); + PendingIntent notifyPendingIntent = PendingIntent.getActivity(context, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT); builder.setContentIntent(notifyPendingIntent); return builder.build(); diff --git a/sample/src/main/res/values/strings.xml b/sample/src/main/res/values/strings.xml index 45cac86..937a0b1 100644 --- a/sample/src/main/res/values/strings.xml +++ b/sample/src/main/res/values/strings.xml @@ -16,4 +16,6 @@ Current position (%d,%d) FloatingView will be deleted soon. FloatingView has been deleted. + default_floatingview_channel + Default Channel