Skip to content

Commit 468893e

Browse files
committed
Moved code from private repo to public repo. Adds autoupdate feature
1 parent 261e7a6 commit 468893e

File tree

9 files changed

+719
-29
lines changed

9 files changed

+719
-29
lines changed

android-wsbridge/app/build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,10 @@ dependencies {
5151
// explicitly depend on RxJava's latest version for bug fixes and new features.
5252
compile 'io.reactivex.rxjava2:rxjava:2.1.3'
5353
compile 'com.android.support:support-annotations:25.0.1'
54+
compile 'com.android.support.constraint:constraint-layout:1.0.2'
5455
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.1'
5556
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1'
56-
debugCompile 'com.github.markzhai:blockcanary-android:1.5.0'
57+
debugCompile 'com.github.markzhai:blockcanary-android:1.5.0'
5758
releaseCompile 'com.github.markzhai:blockcanary-no-op:1.5.0'
5859
}
5960

android-wsbridge/app/src/main/AndroidManifest.xml

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,23 @@
33
package="com.dji.wsbridge">
44

55
<!-- SDK permission requirement -->
6-
<uses-permission android:name="android.permission.VIBRATE"/>
7-
<uses-permission android:name="android.permission.INTERNET"/>
8-
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
9-
<uses-permission android:name="android.permission.WAKE_LOCK"/>
10-
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
11-
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
12-
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
13-
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
14-
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
15-
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
16-
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
17-
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
18-
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
6+
<uses-permission android:name="android.permission.VIBRATE" />
7+
<uses-permission android:name="android.permission.INTERNET" />
8+
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
9+
<uses-permission android:name="android.permission.WAKE_LOCK" />
10+
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
11+
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
12+
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
13+
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
14+
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
15+
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
16+
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
17+
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
18+
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
1919

2020
<uses-feature
2121
android:name="android.hardware.usb.accessory"
22-
android:required="true"/>
22+
android:required="true" />
2323

2424
<!-- SDK requirement permission end -->
2525
<application
@@ -29,30 +29,43 @@
2929
android:label="@string/app_name"
3030
android:supportsRtl="true"
3131
android:theme="@style/AppTheme">
32+
<service
33+
android:name=".lib.BridgeUpdateService"
34+
android:enabled="true"></service>
3235

33-
<activity android:name=".BridgeActivity"
36+
<activity
37+
android:name=".BridgeActivity"
3438
android:launchMode="singleTask">
3539
<intent-filter>
36-
<action android:name="android.intent.action.MAIN"/>
37-
<category android:name="android.intent.category.LAUNCHER"/>
40+
<action android:name="android.intent.action.MAIN" />
41+
42+
<category android:name="android.intent.category.LAUNCHER" />
3843
</intent-filter>
3944
<intent-filter>
40-
<action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"/>
45+
<action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
4146
</intent-filter>
47+
4248
<meta-data
4349
android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
44-
android:resource="@xml/accessory_filter"/>
50+
android:resource="@xml/accessory_filter" />
51+
4552
<intent-filter>
46-
<action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"/>
53+
<action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
4754
</intent-filter>
55+
4856
<meta-data
4957
android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
50-
android:resource="@xml/accessory_filter"/>
58+
android:resource="@xml/accessory_filter" />
5159
</activity>
5260

5361
<meta-data
5462
android:name="io.fabric.ApiKey"
55-
android:value="94a29e4c3255533acef077ec360ef80fc50dce42"/>
63+
android:value="94a29e4c3255533acef077ec360ef80fc50dce42" />
64+
65+
<activity
66+
android:name=".SettingsActivity"
67+
android:label="@string/settings"
68+
android:theme="@android:style/Theme.Material.Dialog"></activity>
5669
</application>
5770

5871
</manifest>

android-wsbridge/app/src/main/java/com/dji/wsbridge/BridgeActivity.java

Lines changed: 121 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,35 @@
11
package com.dji.wsbridge;
22

33
import android.app.Activity;
4+
import android.app.ActivityManager;
5+
import android.app.AlertDialog;
6+
import android.content.BroadcastReceiver;
7+
import android.content.Context;
8+
import android.content.DialogInterface;
49
import android.content.Intent;
10+
import android.content.IntentFilter;
11+
import android.content.SharedPreferences;
512
import android.content.pm.PackageInfo;
613
import android.content.pm.PackageManager;
714
import android.graphics.PorterDuff;
815
import android.hardware.usb.UsbManager;
16+
import android.net.Uri;
17+
import android.os.Build;
918
import android.os.Bundle;
19+
import android.preference.PreferenceManager;
1020
import android.util.Log;
21+
import android.view.View;
1122
import android.view.Window;
23+
import android.view.animation.AlphaAnimation;
24+
import android.view.animation.Animation;
25+
import android.view.animation.LinearInterpolator;
26+
import android.widget.ImageButton;
1227
import android.widget.ImageView;
1328
import android.widget.TextView;
1429
import android.widget.Toast;
1530

1631
import com.dji.wsbridge.lib.BridgeApplication;
32+
import com.dji.wsbridge.lib.BridgeUpdateService;
1733
import com.dji.wsbridge.lib.DJILogger;
1834
import com.dji.wsbridge.lib.StreamRunner;
1935
import com.dji.wsbridge.lib.Utils;
@@ -32,12 +48,18 @@
3248
import io.reactivex.android.schedulers.AndroidSchedulers;
3349
import io.reactivex.functions.Consumer;
3450

51+
3552
public class BridgeActivity extends Activity {
3653

3754
public static final String TAG = "AndroidBridge";
3855
private static final int WEB_SOCKET_PORT = 9007;
3956
private static final Observable HEART_BEAT = Observable.timer(2, TimeUnit.SECONDS).repeat().observeOn(AndroidSchedulers.mainThread());
4057
public static AtomicBoolean isStarted = new AtomicBoolean(false);
58+
private Intent bridgeServiceIntent;
59+
BroadcastReceiver updateAvailableReceiver;
60+
IntentFilter updateAvailableFilter;
61+
SharedPreferences sharedPreferences;
62+
Context ctx;
4163
private TextView mIPTextView;
4264
private ImageView mRCIconView;
4365
private ImageView mWifiIconView;
@@ -52,15 +74,44 @@ public class BridgeActivity extends Activity {
5274
private OutputStream wsOutputStream;
5375
private StreamRunner deviceToWSRunner;
5476
private StreamRunner wsToDeviceRunner;
77+
private ImageButton btnSettings, btnInstallUpdate;
78+
private BridgeUpdateService bridgeUpdateService;
5579

5680
//region -------------------------------------- Activity Callbacks and Helpers ---------------------------------------------
5781
@Override
5882
protected void onCreate(Bundle savedInstanceState) {
5983
super.onCreate(savedInstanceState);
6084
DJILogger.init();
6185
setupViews();
86+
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(BridgeActivity.this);
6287
setupWSConnectionManager();
6388
startHeartBeat();
89+
setupUpdateService();
90+
91+
92+
}
93+
94+
private void setupUpdateService() {
95+
updateAvailableReceiver = new BroadcastReceiver() {
96+
@Override
97+
public void onReceive(Context context, Intent intent) {
98+
btnInstallUpdate.setVisibility(View.VISIBLE);
99+
Animation mAnimation = new AlphaAnimation(1, 0);
100+
mAnimation.setDuration(200);
101+
mAnimation.setInterpolator(new LinearInterpolator());
102+
mAnimation.setRepeatCount(Animation.INFINITE);
103+
mAnimation.setRepeatMode(Animation.REVERSE);
104+
105+
btnInstallUpdate.startAnimation(mAnimation);
106+
}
107+
};
108+
updateAvailableFilter = new IntentFilter(getResources().getString(R.string.intent_filter_update_available));
109+
110+
bridgeUpdateService = new BridgeUpdateService(this);
111+
bridgeServiceIntent = new Intent(this, bridgeUpdateService.getClass());
112+
if (!isMyServiceRunning(bridgeUpdateService.getClass())) {
113+
startService(bridgeServiceIntent);
114+
}
64115

65116
}
66117

@@ -86,6 +137,7 @@ protected void onResume() {
86137
BridgeApplication.getInstance().getBus().register(this);
87138
DJILogger.init();
88139
USBConnectionManager.getInstance().init();
140+
BridgeActivity.this.registerReceiver(updateAvailableReceiver, updateAvailableFilter);
89141
DJILogger.v(TAG, "Resumed");
90142
}
91143

@@ -95,12 +147,15 @@ protected void onPause() {
95147
USBConnectionManager.getInstance().destroy();
96148
stopStreamTransfer();
97149
BridgeApplication.getInstance().getBus().unregister(this);
150+
98151
super.onPause();
152+
99153
}
100154

101155
@Override
102156
protected void onDestroy() {
103157
DJILogger.v(TAG, "Destroyed");
158+
this.unregisterReceiver(updateAvailableReceiver);
104159
super.onDestroy();
105160
}
106161

@@ -110,12 +165,12 @@ protected void onDestroy() {
110165
*/
111166
@Override
112167
protected void onNewIntent(Intent intent) {
113-
114-
switch (intent.getAction()) {
115-
case UsbManager.ACTION_USB_ACCESSORY_ATTACHED:
116-
BridgeApplication.getInstance().getBus().post(new USBConnectionManager.USBConnectionEvent(true));
117-
break;
118-
}
168+
if (intent.getAction() != null)
169+
switch (intent.getAction()) {
170+
case UsbManager.ACTION_USB_ACCESSORY_ATTACHED:
171+
BridgeApplication.getInstance().getBus().post(new USBConnectionManager.USBConnectionEvent(true));
172+
break;
173+
}
119174
super.onNewIntent(intent);
120175
}
121176

@@ -127,6 +182,52 @@ private void setupViews() {
127182
mRCIconView = (ImageView) findViewById(R.id.imageViewRC);
128183
mWifiIconView = (ImageView) findViewById(R.id.imageViewWifi);
129184
TextView mVersionTextView = (TextView) findViewById(R.id.versionText);
185+
btnSettings = (ImageButton) findViewById(R.id.btnSettings);
186+
btnInstallUpdate = (ImageButton) findViewById(R.id.btnInstallUpdate);
187+
btnInstallUpdate.setVisibility(View.GONE);
188+
btnSettings.setOnClickListener(new View.OnClickListener() {
189+
@Override
190+
public void onClick(View v) {
191+
Intent settingsIntent = new Intent(BridgeActivity.this, SettingsActivity.class);
192+
startActivity(settingsIntent);
193+
194+
}
195+
});
196+
btnInstallUpdate.setOnClickListener(new View.OnClickListener() {
197+
@Override
198+
public void onClick(View v) {
199+
AlertDialog.Builder builder;
200+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
201+
builder = new AlertDialog.Builder(BridgeActivity.this, android.R.style.Theme_Material_Dialog_Alert);
202+
} else {
203+
builder = new AlertDialog.Builder(BridgeActivity.this);
204+
}
205+
builder.setTitle("Update avaialble !")
206+
.setMessage("Update is available. Do you want to update the app?")
207+
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
208+
public void onClick(DialogInterface dialog, int which) {
209+
btnInstallUpdate.clearAnimation();
210+
btnInstallUpdate.setVisibility(View.GONE);
211+
Intent install = new Intent(Intent.ACTION_VIEW);
212+
install.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
213+
install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
214+
Uri uri = Uri.parse(sharedPreferences.getString(getResources().getString(R.string.preference_update_uri), ""));
215+
install.setDataAndType(uri,
216+
sharedPreferences.getString(getResources().getString(R.string.preference_update_mimetype), ""));
217+
startActivity(install);
218+
}
219+
})
220+
.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
221+
public void onClick(DialogInterface dialog, int which) {
222+
// do nothing
223+
}
224+
})
225+
.setIcon(android.R.drawable.ic_dialog_alert)
226+
.show();
227+
228+
}
229+
});
230+
130231
// Show version number
131232
try {
132233
PackageInfo pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
@@ -362,4 +463,18 @@ public void run() {
362463
});
363464
}
364465
//endregion
466+
467+
private boolean isMyServiceRunning(Class<?> serviceClass) {
468+
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
469+
for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
470+
if (serviceClass.getName().equals(service.service.getClassName())) {
471+
Log.i("isMyServiceRunning?", true + "");
472+
return true;
473+
}
474+
}
475+
Log.i("isMyServiceRunning?", false + "");
476+
return false;
477+
}
478+
479+
365480
}

0 commit comments

Comments
 (0)