Skip to content

Commit aa1fe0d

Browse files
Merge pull request #12 from Kaiserdragon2/rework
Hopfully service now runs stable in the Background
2 parents 7c3d446 + d49b5a0 commit aa1fe0d

7 files changed

Lines changed: 121 additions & 81 deletions

File tree

app/build.gradle

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ android {
77

88
defaultConfig {
99
applicationId "de.kaiserdragon.callforwardingstatus"
10-
minSdk 26
10+
minSdk 28
1111
targetSdk 34
12-
versionCode 6
13-
versionName "1.8"
12+
versionCode 7
13+
versionName "1.9"
1414

1515
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
1616
}
@@ -50,4 +50,6 @@ dependencies {
5050
implementation 'androidx.appcompat:appcompat:1.7.0'
5151
implementation 'com.google.android.material:material:1.12.0'
5252
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
53+
implementation("androidx.work:work-runtime-ktx:2.9.0")
54+
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.14'
5355
}

app/src/main/java/de/kaiserdragon/callforwardingstatus/CallForwardingReceiver.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package de.kaiserdragon.callforwardingstatus;
22

33
import static android.content.Context.TELEPHONY_SERVICE;
4-
import static androidx.core.content.ContextCompat.getSystemService;
5-
import static de.kaiserdragon.callforwardingstatus.BuildConfig.DEBUG;
64

75
import android.Manifest;
86
import android.content.BroadcastReceiver;
@@ -19,10 +17,10 @@
1917

2018
import androidx.core.app.ActivityCompat;
2119

22-
import java.lang.reflect.Method;
2320
import java.util.List;
2421
import java.util.Objects;
2522

23+
2624
public class CallForwardingReceiver extends BroadcastReceiver {
2725
final String TAG = "Receiver";
2826

@@ -31,8 +29,9 @@ public void onReceive(Context context, Intent intent) {
3129
if ("de.kaiserdragon.callforwardingstatus.TOGGLE_CALL_FORWARDING".equals(intent.getAction())) {
3230
DatabaseHelper databaseHelper = new DatabaseHelper(context);
3331
String[] array = databaseHelper.getSelected();
34-
if (DEBUG) Log.v(TAG, "Number = " + array[1]);
35-
if (!array[1].equals("")) {
32+
databaseHelper.close();
33+
//if (DEBUG) Log.v(TAG, "Number = " + array[1]);
34+
if (!array[1].isEmpty()) {
3635
Toast.makeText(context, context.getString(R.string.setupCallForwarding), Toast.LENGTH_LONG).show();
3736
setCallForwarding(context, PhoneStateService.currentState, array[1]);
3837
} else
@@ -51,8 +50,8 @@ public int getSavedSelectedSimId(Context context) {
5150

5251

5352
private void setCallForwarding(Context context, boolean cfi, String phoneNumber) {
54-
if (DEBUG) Log.i(TAG, String.valueOf(cfi));
55-
if (DEBUG) Log.v(TAG, phoneNumber);
53+
//if (DEBUG) Log.i(TAG, String.valueOf(cfi));
54+
//if (DEBUG) Log.v(TAG, phoneNumber);
5655
TelephonyManager manager = (TelephonyManager) context.getSystemService(TELEPHONY_SERVICE);
5756

5857
int defaultSubId = getSavedSelectedSimId(context);

app/src/main/java/de/kaiserdragon/callforwardingstatus/ForwardingStatusWidget.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package de.kaiserdragon.callforwardingstatus;
22

3-
43
import static android.content.Context.MODE_PRIVATE;
54

65
import static de.kaiserdragon.callforwardingstatus.BuildConfig.DEBUG;
@@ -84,13 +83,15 @@ public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidge
8483
@Override
8584
public void onReceive(Context context, Intent intent) {
8685
super.onReceive(context, intent);
87-
load(context);
86+
//load(context);
87+
Log.v(TAG,"onReceive got called");
8888
if ("de.kaiserdragon.callforwardingstatus.APPWIDGET_UPDATE_CFI".equals(intent.getAction())) {
8989
// Get the current CFI value from the Intent extra
9090
currentState = intent.getBooleanExtra("cfi", currentState);
91+
if(DEBUG)Log.v(TAG,"CFI:"+currentState);
9192
//currentState = cfi;
92-
93-
save(context);
93+
PhoneStateService.currentState = currentState;
94+
//save(context);
9495
// Update the widget with the current CFI value
9596
updateWidget(context, currentState);
9697
}
@@ -163,10 +164,7 @@ public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] a
163164
if (DEBUG) Log.v(TAG,"onUpdate got called");
164165
Intent serviceIntent = new Intent(context, PhoneStateService.class);
165166
context.startForegroundService(serviceIntent);
166-
load(context);
167167
updateWidget(context, currentState);
168-
169-
170168
}
171169

172170
@Override

app/src/main/java/de/kaiserdragon/callforwardingstatus/MainActivity.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package de.kaiserdragon.callforwardingstatus;
22

3-
import static android.Manifest.permission.FOREGROUND_SERVICE_SPECIAL_USE;
4-
53
import static de.kaiserdragon.callforwardingstatus.BuildConfig.DEBUG;
64

75
import android.Manifest;
@@ -237,7 +235,7 @@ private void setCheckedRadioButton() {
237235
if (Objects.equals(array[0], "1")) radioButton1.setChecked(true);
238236
if (Objects.equals(array[0], "2")) radioButton2.setChecked(true);
239237
if (Objects.equals(array[0], "3")) radioButton3.setChecked(true);
240-
Log.i(TAG, "Retrieve Data" + array[0] + "phone" + array[1]);
238+
//Log.i(TAG, "Retrieve Data" + array[0] + "phone" + array[1]);
241239
}
242240

243241
public void MultiSim(Context context) {
@@ -292,7 +290,7 @@ public int getSavedSelectedSimId(Context context) {
292290

293291
private String getPhoneNumber(int row) {
294292
// Query the database to retrieve the data
295-
Log.i(TAG, "Retrieve Data");
293+
//Log.i(TAG, "Retrieve Data");
296294
SQLiteDatabase database = databaseHelper.getReadableDatabase();
297295
String[] columns = {databaseHelper.getColumnPhoneNumber()};
298296
String selection = databaseHelper.getColumnId() + " = ?";
@@ -494,7 +492,6 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis
494492
public class SimSelectionDialog extends AlertDialog {
495493
private final List<SubscriptionInfo> subscriptionList;
496494
private ListView listView;
497-
private ArrayAdapter<String> adapter;
498495

499496
protected SimSelectionDialog(Context context, List<SubscriptionInfo> subscriptionList) {
500497
super(context);
@@ -505,7 +502,7 @@ protected SimSelectionDialog(Context context, List<SubscriptionInfo> subscriptio
505502
private void init() {
506503
Context context = getContext();
507504
listView = new ListView(context);
508-
adapter = new ArrayAdapter<>(context, android.R.layout.simple_list_item_single_choice);
505+
ArrayAdapter<String> adapter = new ArrayAdapter<>(context, android.R.layout.simple_list_item_single_choice);
509506
for (SubscriptionInfo subscriptionInfo : subscriptionList) {
510507
int subscriptionId = subscriptionInfo.getSubscriptionId();
511508
String displayName = subscriptionInfo.getDisplayName().toString();

app/src/main/java/de/kaiserdragon/callforwardingstatus/PhoneStateService.java

Lines changed: 29 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -9,36 +9,32 @@
99
import android.app.NotificationChannel;
1010
import android.app.NotificationManager;
1111
import android.app.Service;
12-
import android.appwidget.AppWidgetManager;
13-
import android.content.ComponentName;
1412
import android.content.Context;
1513
import android.content.Intent;
1614
import android.content.pm.PackageManager;
1715
import android.os.Build;
1816
import android.os.IBinder;
1917
import android.telephony.PhoneStateListener;
20-
import android.telephony.TelephonyCallback;
2118
import android.telephony.TelephonyManager;
2219
import android.util.Log;
23-
24-
import androidx.annotation.RequiresApi;
20+
import androidx.annotation.Nullable;
2521
import androidx.core.app.ActivityCompat;
2622
import androidx.core.app.NotificationCompat;
2723

2824
import java.util.concurrent.Executor;
2925
import java.util.concurrent.Executors;
3026

31-
import kotlin.Deprecated;
32-
import kotlin.Suppress;
27+
import de.kaiserdragon.callforwardingstatus.helper.CallForwardingListener;
3328

3429
public class PhoneStateService extends Service {
3530
private static final String CHANNEL_ID = "CallForwardingServiceID";
3631
public static boolean currentState;
37-
Context context;
32+
Context appcontext;
3833
static final String TAG = "Service";
39-
private final Executor executor = Executors.newSingleThreadExecutor();
34+
4035
// Define NOTIFICATION_ID as a constant
4136
private static final int NOTIFICATION_ID = 1;
37+
private CallForwardingListener callForwardingListener;
4238

4339

4440
/** @noinspection deprecation*/
@@ -47,24 +43,16 @@ public class PhoneStateService extends Service {
4743
@Override
4844
public void onCallForwardingIndicatorChanged(boolean cfi) {
4945
if (DEBUG)Log.i(TAG, "onCallForwardingIndicatorChanged CFI Old=" + cfi);
50-
// Get the current state of unconditional call forwarding
51-
currentState = cfi;
5246
// Create an Intent with the android.appwidget.action.APPWIDGET_UPDATE action
53-
Intent intent = new Intent(context, ForwardingStatusWidget.class);
47+
Intent intent = new Intent(appcontext, ForwardingStatusWidget.class);
5448
intent.setAction("de.kaiserdragon.callforwardingstatus.APPWIDGET_UPDATE_CFI");
55-
//Toast.makeText(context, "OLD", Toast.LENGTH_SHORT).show();
56-
// Add the app widget IDs as an extra
57-
int[] ids = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), ForwardingStatusWidget.class));
58-
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids);
59-
6049
// Add the CFI value as an extra
61-
intent.putExtra("cfi", currentState);
62-
50+
intent.putExtra("cfi", cfi);
6351
// Send the broadcast
6452
sendBroadcast(intent);
6553

6654
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) {
67-
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
55+
if (ActivityCompat.checkSelfPermission(appcontext, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
6856
super.onCallForwardingIndicatorChanged(cfi);
6957
}
7058
}
@@ -74,10 +62,10 @@ public void onCallForwardingIndicatorChanged(boolean cfi) {
7462
@Override
7563
public void onCreate() {
7664
super.onCreate();
77-
context = getApplicationContext();
65+
appcontext = getApplicationContext();
7866
createNotificationChannel();
7967
startForegroundService();
80-
registerPhoneStateListener();
68+
8169
}
8270

8371
private void createNotificationChannel() {
@@ -99,7 +87,7 @@ private void startForegroundService() {
9987
.build();
10088

10189
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE){
102-
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.FOREGROUND_SERVICE_SPECIAL_USE)
90+
if (ActivityCompat.checkSelfPermission(appcontext, Manifest.permission.FOREGROUND_SERVICE_SPECIAL_USE)
10391
== PackageManager.PERMISSION_GRANTED) {
10492
startForeground(NOTIFICATION_ID, notification, FOREGROUND_SERVICE_TYPE_SPECIAL_USE);
10593
} else {
@@ -114,61 +102,44 @@ private void startForegroundService() {
114102

115103
@Override
116104
public int onStartCommand(Intent intent, int flags, int startId) {
105+
registerPhoneStateListener();
117106
return START_STICKY;
118107
}
119108

120109
@SuppressWarnings("deprecation")
121110
private void registerPhoneStateListener() {
122111
TelephonyManager telephonyManager = getSystemService(TelephonyManager.class); // Use class reference for type safety
123-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
124-
MyCallForwardingListener listener = new MyCallForwardingListener();
125-
telephonyManager.registerTelephonyCallback(Executors.newSingleThreadExecutor(), listener);
126-
if (DEBUG) Log.i(TAG, "Registered TelephonyCallback");
112+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
113+
if (callForwardingListener == null) { // Check if already registered
114+
callForwardingListener = new CallForwardingListener(appcontext);
115+
telephonyManager.registerTelephonyCallback(Executors. newSingleThreadExecutor(), callForwardingListener);
116+
if (DEBUG) Log.i(TAG, "Registered TelephonyCallback");
117+
}
127118
} else {
128119
telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR);
129-
if (DEBUG) Log.i(TAG, "Registered PhoneStateListener");
120+
//if (DEBUG) Log.i(TAG, "Registered PhoneStateListener");
130121
}
131122
}
132123

133124
@Override
134125
@SuppressWarnings("deprecation")
135126
public void onDestroy() {
136-
Log.d(TAG,"Destroy");
137-
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
138-
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.S) telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE);
127+
Log.d(TAG, "Destroy");
128+
TelephonyManager telephonyManager = getSystemService(TelephonyManager.class);
129+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S &&callForwardingListener != null) {
130+
telephonyManager.unregisterTelephonyCallback(callForwardingListener); // Unregister explicitly
131+
callForwardingListener = null;
132+
if (DEBUG) Log.i(TAG, "Unregistered TelephonyCallback");
133+
} else {
134+
telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE);
135+
}
139136
super.onDestroy();
140-
// Unregister MyPhoneStateListener as a phone state listener
141137
}
142138

139+
@Nullable
143140
@Override
144141
public IBinder onBind(Intent intent) {
145-
// Return null as this service is not bound to any activity
146142
return null;
147143
}
148144

149-
@RequiresApi(api = Build.VERSION_CODES.S)
150-
public class MyCallForwardingListener extends TelephonyCallback implements TelephonyCallback.CallForwardingIndicatorListener {
151-
@Override
152-
public void onCallForwardingIndicatorChanged(boolean cfi) {
153-
// Handle the call forwarding state change here
154-
if (DEBUG) Log.i(TAG, "onCallForwardingIndicatorChanged CFI New=" + cfi);
155-
// Get the current state of unconditional call forwarding
156-
//Toast.makeText(context, "New", Toast.LENGTH_SHORT).show();
157-
currentState = cfi;
158-
// Create an Intent with the android.appwidget.action.APPWIDGET_UPDATE action
159-
Intent intent = new Intent(context, ForwardingStatusWidget.class);
160-
intent.setAction("de.kaiserdragon.callforwardingstatus.APPWIDGET_UPDATE_CFI");
161-
162-
// Add the app widget IDs as an extra
163-
int[] ids = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), ForwardingStatusWidget.class));
164-
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids);
165-
166-
// Add the CFI value as an extra
167-
intent.putExtra("cfi", currentState);
168-
169-
// Send the broadcast
170-
sendBroadcast(intent);
171-
172-
}
173-
}
174145
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package de.kaiserdragon.callforwardingstatus;
2+
3+
import android.content.Context;
4+
5+
import androidx.annotation.NonNull;
6+
import androidx.work.ListenableWorker;
7+
import androidx.work.Worker;
8+
import androidx.work.WorkerParameters;
9+
10+
public class PhoneStateWorker extends Worker {
11+
public PhoneStateWorker(
12+
@NonNull Context context,
13+
@NonNull WorkerParameters params) {
14+
super(context, params);
15+
}
16+
17+
@NonNull
18+
@Override
19+
public Result doWork() {
20+
return null;
21+
}
22+
23+
24+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package de.kaiserdragon.callforwardingstatus.helper;
2+
3+
import android.content.Context;
4+
import android.content.Intent;
5+
import android.os.Build;
6+
import android.telephony.TelephonyCallback;
7+
import android.util.Log;
8+
9+
import androidx.annotation.NonNull;
10+
import androidx.annotation.RequiresApi;
11+
12+
import java.lang.ref.WeakReference;
13+
14+
import de.kaiserdragon.callforwardingstatus.BuildConfig;
15+
import de.kaiserdragon.callforwardingstatus.ForwardingStatusWidget;
16+
import de.kaiserdragon.callforwardingstatus.PhoneStateService;
17+
18+
@RequiresApi(api = Build.VERSION_CODES.S)
19+
public class CallForwardingListener extends TelephonyCallback implements TelephonyCallback.CallForwardingIndicatorListener {
20+
21+
private static final String TAG = "CallForwardingListener";
22+
private static WeakReference<Context> contextRef;
23+
24+
public CallForwardingListener(@NonNull Context context) {
25+
contextRef = new WeakReference<>(context);
26+
}
27+
28+
@Override
29+
public void onCallForwardingIndicatorChanged(boolean callForwardingIndicator) {
30+
31+
if (BuildConfig.DEBUG) {
32+
Log.i(TAG, "onCallForwardingIndicatorChanged - New CFI (different from last): " + callForwardingIndicator);
33+
34+
PhoneStateService.currentState = callForwardingIndicator;
35+
sendWidgetUpdateBroadcast(callForwardingIndicator);
36+
}
37+
38+
}
39+
40+
private void sendWidgetUpdateBroadcast(boolean callForwardingIndicator) {
41+
Context context = contextRef.get();
42+
Intent intent = new Intent(context, ForwardingStatusWidget.class);
43+
intent.setAction("de.kaiserdragon.callforwardingstatus.APPWIDGET_UPDATE_CFI");
44+
// Add the CFI value as an extra
45+
intent.putExtra("cfi", callForwardingIndicator);
46+
// Send the broadcast
47+
context.sendBroadcast(intent);
48+
}
49+
}

0 commit comments

Comments
 (0)