Skip to content

Commit

Permalink
fix: better function name and order + fix android activity issue
Browse files Browse the repository at this point in the history
  • Loading branch information
riderx committed Feb 13, 2023
1 parent 52636bd commit 4232fee
Show file tree
Hide file tree
Showing 2 changed files with 158 additions and 110 deletions.
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package ee.forgr.capacitor_updater;

import android.app.Activity;
import android.app.ActivityManager;
import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Build;
Expand Down Expand Up @@ -1026,71 +1029,6 @@ public void run() {
.start();
}

@Override // appMovedToForeground
public void onActivityStarted(@NonNull final Activity activity) {
this._checkCancelDelay(true);
if (CapacitorUpdaterPlugin.this._isAutoUpdateEnabled()) {
this.backgroundDownload();
}
this.checkAppReady();
}

@Override // appMovedToBackground
public void onActivityStopped(@NonNull final Activity activity) {
Log.i(CapacitorUpdater.TAG, "Checking for pending update");
try {
Gson gson = new Gson();
String delayUpdatePreferences = prefs.getString(
DELAY_CONDITION_PREFERENCES,
"[]"
);
Type type = new TypeToken<ArrayList<DelayCondition>>() {}.getType();
ArrayList<DelayCondition> delayConditionList = gson.fromJson(
delayUpdatePreferences,
type
);
String backgroundValue = null;
for (DelayCondition delayCondition : delayConditionList) {
if (delayCondition.getKind().toString().equals("background")) {
String value = delayCondition.getValue();
backgroundValue = (value != null && !value.isEmpty()) ? value : "0";
}
}
if (backgroundValue != null) {
taskRunning = true;
final Long timeout = Long.parseLong(backgroundValue);
if (backgroundTask != null) {
backgroundTask.interrupt();
}
backgroundTask =
new Thread(
new Runnable() {
@Override
public void run() {
try {
Thread.sleep(timeout);
taskRunning = false;
_checkCancelDelay(false);
installNext();
} catch (InterruptedException e) {
Log.i(
CapacitorUpdater.TAG,
"Background Task canceled, Activity resumed before timer completes"
);
}
}
}
);
backgroundTask.start();
} else {
this._checkCancelDelay(false);
this.installNext();
}
} catch (final Exception e) {
Log.e(CapacitorUpdater.TAG, "Error during onActivityStopped", e);
}
}

private void installNext() {
try {
Gson gson = new Gson();
Expand Down Expand Up @@ -1216,6 +1154,116 @@ public void run() {
}
}

public void appMovedToForeground() {
this._checkCancelDelay(true);
if (CapacitorUpdaterPlugin.this._isAutoUpdateEnabled()) {
this.backgroundDownload();
}
this.checkAppReady();
}

public void appMovedToBackground() {
Log.i(CapacitorUpdater.TAG, "Checking for pending update");
try {
Gson gson = new Gson();
String delayUpdatePreferences = prefs.getString(
DELAY_CONDITION_PREFERENCES,
"[]"
);
Type type = new TypeToken<ArrayList<DelayCondition>>() {}.getType();
ArrayList<DelayCondition> delayConditionList = gson.fromJson(
delayUpdatePreferences,
type
);
String backgroundValue = null;
for (DelayCondition delayCondition : delayConditionList) {
if (delayCondition.getKind().toString().equals("background")) {
String value = delayCondition.getValue();
backgroundValue = (value != null && !value.isEmpty()) ? value : "0";
}
}
if (backgroundValue != null) {
taskRunning = true;
final Long timeout = Long.parseLong(backgroundValue);
if (backgroundTask != null) {
backgroundTask.interrupt();
}
backgroundTask =
new Thread(
new Runnable() {
@Override
public void run() {
try {
Thread.sleep(timeout);
taskRunning = false;
_checkCancelDelay(false);
installNext();
} catch (InterruptedException e) {
Log.i(
CapacitorUpdater.TAG,
"Background Task canceled, Activity resumed before timer completes"
);
}
}
}
);
backgroundTask.start();
} else {
this._checkCancelDelay(false);
this.installNext();
}
} catch (final Exception e) {
Log.e(CapacitorUpdater.TAG, "Error during onActivityStopped", e);
}
}

@Override
public void onActivityStarted(@NonNull final Activity activity) {
this.appMovedToForeground();
}

@Override
public void onActivityStopped(@NonNull final Activity activity) {
Context mContext = this.getContext();
ActivityManager activityManager = (ActivityManager) mContext.getSystemService(
Context.ACTIVITY_SERVICE
);
List<ActivityManager.AppTask> runningTasks = activityManager.getAppTasks();
String runningActivity = runningTasks
.get(0)
.getTaskInfo()
.topActivity.getClassName();
ActivityManager.RecentTaskInfo runningTask = runningTasks
.get(0)
.getTaskInfo();
String className = runningTask.baseIntent.getComponent().getClassName();
ActivityInfo[] activities = null;
try {
activities =
mContext
.getPackageManager()
.getPackageInfo(
mContext.getPackageName(),
PackageManager.GET_ACTIVITIES
)
.activities;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
boolean isThisAppActivity = false;
for (ActivityInfo activityInfo : activities) {
if (
activityInfo.name.equals(className) &&
!className.equals(runningActivity)
) {
isThisAppActivity = true;
}
}
if (!isThisAppActivity) {
this.appMovedToBackground();
}
}

@Override
public void onActivityResumed(@NonNull final Activity activity) {
if (backgroundTask != null && taskRunning) {
Expand Down
90 changes: 45 additions & 45 deletions ios/Plugin/CapacitorUpdaterPlugin.swift
Original file line number Diff line number Diff line change
Expand Up @@ -573,51 +573,6 @@ public class CapacitorUpdaterPlugin: CAPPlugin {
}
}

@objc func appMovedToForeground() {
if backgroundWork != nil && taskRunning {
backgroundWork!.cancel()
print("\(self.implementation.TAG) Background Timer Task canceled, Activity resumed before timer completes")
}
if self._isAutoUpdateEnabled() {
self.backgroundDownload()
}
self.checkAppReady()
}

@objc func appMovedToBackground() {
print("\(self.implementation.TAG) Check for pending update")
let delayUpdatePreferences = UserDefaults.standard.string(forKey: DELAY_CONDITION_PREFERENCES) ?? "[]"

let delayConditionList: [DelayCondition] = fromJsonArr(json: delayUpdatePreferences).map { obj -> DelayCondition in
let kind: String = obj.value(forKey: "kind") as! String
let value: String? = obj.value(forKey: "value") as? String
return DelayCondition(kind: kind, value: value)
}
var backgroundValue: String?
for delayCondition in delayConditionList {
if delayCondition.getKind() == "background" {
let value: String? = delayCondition.getValue()
backgroundValue = (value != nil && value != "") ? value! : "0"
}
}
if backgroundValue != nil {
self.taskRunning = true
let interval: Double = (Double(backgroundValue!) ?? 0.0) / 1000
self.backgroundWork?.cancel()
self.backgroundWork = DispatchWorkItem(block: {
// IOS never executes this task in background
self.taskRunning = false
self._checkCancelDelay(killed: false)
self.installNext()
})
DispatchQueue.global(qos: .background).asyncAfter(deadline: .now() + interval, execute: self.backgroundWork!)
} else {
self._checkCancelDelay(killed: false)
self.installNext()
}

}

@objc func appKilled() {
self._checkCancelDelay(killed: true)
}
Expand Down Expand Up @@ -662,4 +617,49 @@ public class CapacitorUpdaterPlugin: CAPPlugin {
) as? [NSObject]
return object ?? []
}

@objc func appMovedToForeground() {
if backgroundWork != nil && taskRunning {
backgroundWork!.cancel()
print("\(self.implementation.TAG) Background Timer Task canceled, Activity resumed before timer completes")
}
if self._isAutoUpdateEnabled() {
self.backgroundDownload()
}
self.checkAppReady()
}

@objc func appMovedToBackground() {
print("\(self.implementation.TAG) Check for pending update")
let delayUpdatePreferences = UserDefaults.standard.string(forKey: DELAY_CONDITION_PREFERENCES) ?? "[]"

let delayConditionList: [DelayCondition] = fromJsonArr(json: delayUpdatePreferences).map { obj -> DelayCondition in
let kind: String = obj.value(forKey: "kind") as! String
let value: String? = obj.value(forKey: "value") as? String
return DelayCondition(kind: kind, value: value)
}
var backgroundValue: String?
for delayCondition in delayConditionList {
if delayCondition.getKind() == "background" {
let value: String? = delayCondition.getValue()
backgroundValue = (value != nil && value != "") ? value! : "0"
}
}
if backgroundValue != nil {
self.taskRunning = true
let interval: Double = (Double(backgroundValue!) ?? 0.0) / 1000
self.backgroundWork?.cancel()
self.backgroundWork = DispatchWorkItem(block: {
// IOS never executes this task in background
self.taskRunning = false
self._checkCancelDelay(killed: false)
self.installNext()
})
DispatchQueue.global(qos: .background).asyncAfter(deadline: .now() + interval, execute: self.backgroundWork!)
} else {
self._checkCancelDelay(killed: false)
self.installNext()
}

}
}

0 comments on commit 4232fee

Please sign in to comment.