Open info dialog from notification

This commit is contained in:
xynngh 2020-05-07 21:35:55 +04:00
parent c056f7becc
commit d65828f369
7 changed files with 170 additions and 57 deletions

View File

@ -38,6 +38,13 @@
android:label="@string/title_activity_reviews"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name=".InfoDialogActivity"
android:autoRemoveFromRecents="true"
android:excludeFromRecents="true"
android:noHistory="true"
android:theme="@style/DialogBackgroundTheme" />
<receiver
android:name=".CallReceiver"
android:enabled="true"

View File

@ -0,0 +1,33 @@
package dummydomain.yetanothercallblocker;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import dummydomain.yetanothercallblocker.data.DatabaseSingleton;
import dummydomain.yetanothercallblocker.data.NumberInfo;
public class InfoDialogActivity extends AppCompatActivity {
public static final String PARAM_NUMBER = "number";
public static Intent getIntent(Context context, String number) {
Intent intent = new Intent(context, InfoDialogActivity.class);
intent.putExtra(PARAM_NUMBER, number);
return intent;
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
NumberInfo numberInfo = DatabaseSingleton.getNumberInfo(
getIntent().getStringExtra(PARAM_NUMBER));
InfoDialogHelper.showDialog(this, numberInfo, (d) -> finish());
}
}

View File

@ -0,0 +1,67 @@
package dummydomain.yetanothercallblocker;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.DialogInterface;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import androidx.appcompat.app.AlertDialog;
import dummydomain.yetanothercallblocker.data.NumberInfo;
public class InfoDialogHelper {
public static void showDialog(Context context, NumberInfo numberInfo,
DialogInterface.OnDismissListener onDismissListener) {
AlertDialog.Builder builder = new AlertDialog.Builder(context)
.setTitle(numberInfo.number);
@SuppressLint("InflateParams")
View view = LayoutInflater.from(context).inflate(R.layout.info_dialog, null);
String name = "";
String contactName = numberInfo.contactItem != null
? numberInfo.contactItem.displayName : null;
if (!TextUtils.isEmpty(contactName)) {
name += contactName;
}
String featuredName = numberInfo.featuredDatabaseItem != null
? numberInfo.featuredDatabaseItem.getName() : null;
if (!TextUtils.isEmpty(featuredName)) {
if (name.isEmpty()) {
name = featuredName;
} else {
name += "\n(" + featuredName + ")";
}
}
TextView nameView = view.findViewById(R.id.name);
if (!TextUtils.isEmpty(name)) {
nameView.setText(name);
} else {
nameView.setVisibility(View.GONE);
}
ReviewsSummaryHelper.populateSummary(view.findViewById(R.id.reviews_summary),
numberInfo.communityDatabaseItem);
builder.setView(view);
builder.setNeutralButton(R.string.online_reviews, (d, w)
-> ReviewsActivity.startForNumber(context, numberInfo.number));
builder.setNegativeButton(R.string.back, null);
if (onDismissListener != null) builder.setOnDismissListener(onDismissListener);
builder.show();
}
}

View File

@ -5,11 +5,9 @@ import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
@ -201,50 +199,7 @@ public class MainActivity extends AppCompatActivity {
}
private void onCallLogItemClicked(CallLogItem item) {
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle(item.number);
@SuppressLint("InflateParams")
View view = getLayoutInflater().inflate(R.layout.info_dialog, null);
String name = "";
String contactName = item.numberInfo.contactItem != null
? item.numberInfo.contactItem.displayName : null;
if (!TextUtils.isEmpty(contactName)) {
name += contactName;
}
String featuredName = item.numberInfo.featuredDatabaseItem != null
? item.numberInfo.featuredDatabaseItem.getName() : null;
if (!TextUtils.isEmpty(featuredName)) {
if (name.isEmpty()) {
name = featuredName;
} else {
name += "\n(" + featuredName + ")";
}
}
TextView nameView = view.findViewById(R.id.name);
if (!TextUtils.isEmpty(name)) {
nameView.setText(name);
} else {
nameView.setVisibility(View.GONE);
}
ReviewsSummaryHelper.populateSummary(view.findViewById(R.id.reviews_summary),
item.numberInfo.communityDatabaseItem);
builder.setView(view);
builder.setNeutralButton(R.string.online_reviews, (d, w)
-> ReviewsActivity.startForNumber(this, item.number));
builder.setNegativeButton(R.string.back, null);
builder.show();
InfoDialogHelper.showDialog(this, item.numberInfo, null);
}
private void loadCallLog() {

View File

@ -20,6 +20,8 @@ import dummydomain.yetanothercallblocker.data.NumberInfo;
import dummydomain.yetanothercallblocker.sia.model.NumberCategory;
import dummydomain.yetanothercallblocker.sia.model.database.CommunityDatabaseItem;
import static dummydomain.yetanothercallblocker.PendingIntentHelper.forActivity;
public class NotificationHelper {
private static final String NOTIFICATION_TAG_INCOMING_CALL = "incomingCallNotification";
@ -129,7 +131,7 @@ public class NotificationHelper {
IconAndColor iconAndColor = IconAndColor.forNumberRating(
numberInfo.rating, numberInfo.contactItem != null);
return new NotificationCompat.Builder(context, channelId)
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, channelId)
.setSmallIcon(iconAndColor.iconResId)
.setColor(iconAndColor.getColorInt(context))
.setContentTitle(title)
@ -137,24 +139,29 @@ public class NotificationHelper {
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setCategory(NotificationCompat.CATEGORY_STATUS)
.setShowWhen(false)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC) // TODO: check
.setContentIntent(createReviewsIntent(context, numberInfo))
.build();
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC); // TODO: check
addCallNotificationIntents(context, builder, numberInfo);
return builder.build();
}
private static Notification createBlockedCallNotification(Context context, NumberInfo numberInfo) {
String title = context.getString(R.string.notification_blocked_call);
String text = getDescription(context, numberInfo);
return new NotificationCompat.Builder(context, CHANNEL_ID_BLOCKED_INFO)
NotificationCompat.Builder builder = new NotificationCompat.Builder(
context, CHANNEL_ID_BLOCKED_INFO)
.setSmallIcon(R.drawable.ic_thumb_down_24dp)
.setColor(0xffffff60)
.setContentTitle(title)
.setContentText(text)
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setCategory(NotificationCompat.CATEGORY_STATUS)
.setContentIntent(createReviewsIntent(context, numberInfo))
.build();
.setCategory(NotificationCompat.CATEGORY_STATUS);
addCallNotificationIntents(context, builder, numberInfo);
return builder.build();
}
private static String getDescription(Context context, NumberInfo numberInfo) {
@ -178,10 +185,20 @@ public class NotificationHelper {
return text;
}
private static void addCallNotificationIntents(Context context,
NotificationCompat.Builder builder,
NumberInfo numberInfo) {
builder.setContentIntent(createInfoIntent(context, numberInfo))
.addAction(0, context.getString(R.string.online_reviews),
createReviewsIntent(context, numberInfo));
}
private static PendingIntent createInfoIntent(Context context, NumberInfo numberInfo) {
return forActivity(context, InfoDialogActivity.getIntent(context, numberInfo.number));
}
private static PendingIntent createReviewsIntent(Context context, NumberInfo numberInfo) {
Intent intent = ReviewsActivity.getNumberIntent(context, numberInfo.number);
intent.setAction(Long.toString(System.currentTimeMillis())); // make the intent "unique"
return PendingIntent.getActivity(context, 0, intent, 0);
return forActivity(context, ReviewsActivity.getNumberIntent(context, numberInfo.number));
}
static void createNotificationChannels(Context context) {

View File

@ -0,0 +1,26 @@
package dummydomain.yetanothercallblocker;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
public class PendingIntentHelper {
public static PendingIntent forActivity(Context context, Intent intent) {
// creates a new pending intent instead of returning an existing one
return PendingIntent.getActivity(context, getRandomInt(), intent, 0);
}
private static int getRandomInt() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
return ThreadLocalRandom.current().nextInt();
} else {
return new Random().nextInt();
}
}
}

View File

@ -17,4 +17,12 @@
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
<style name="DialogBackgroundTheme" parent="AppTheme.NoActionBar">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
<item name="android:backgroundDimEnabled">false</item>
</style>
</resources>