Skip to content

Commit e6fc385

Browse files
committed
THETA プラグイン設定画面の Android 10 対応。
1 parent 8bb1717 commit e6fc385

13 files changed

Lines changed: 507 additions & 389 deletions

File tree

dConnectDevicePlugin/dConnectDeviceTheta/app/build.gradle

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
apply plugin: 'com.android.application'
22

33
android {
4-
compileSdkVersion 26
5-
buildToolsVersion '28.0.3'
4+
compileSdkVersion 29
65

76
def getVersionName = { ->
87
def version
@@ -18,7 +17,7 @@ android {
1817
defaultConfig {
1918
applicationId "org.deviceconnect.android.deviceplugin.theta"
2019
minSdkVersion 16
21-
targetSdkVersion 26
20+
targetSdkVersion 29
2221
versionCode 7
2322
versionName getVersionName()
2423
}
@@ -71,6 +70,7 @@ repositories {
7170
dependencies {
7271
implementation fileTree(include: '*.jar', dir: 'libs')
7372
implementation 'org.deviceconnect:dconnect-device-plugin-sdk:2.5.1'
74-
implementation 'com.squareup.okhttp:okhttp:2.5.0'
73+
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
74+
implementation 'com.android.support:support-v4:26.1.0'
7575
implementation 'com.burgstaller:okhttp-digest:1.16'
7676
}

dConnectDevicePlugin/dConnectDeviceTheta/app/src/main/java/org/deviceconnect/android/deviceplugin/theta/ThetaDeviceService.java

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,37 @@
66
*/
77
package org.deviceconnect.android.deviceplugin.theta;
88

9+
import android.annotation.TargetApi;
910
import android.content.BroadcastReceiver;
1011
import android.content.Context;
1112
import android.content.Intent;
1213
import android.content.IntentFilter;
14+
import android.net.ConnectivityManager;
15+
import android.net.Network;
16+
import android.net.NetworkCapabilities;
1317
import android.net.NetworkInfo;
18+
import android.net.NetworkRequest;
19+
import android.net.wifi.ScanResult;
1420
import android.net.wifi.WifiInfo;
1521
import android.net.wifi.WifiManager;
22+
import android.net.wifi.WifiNetworkSpecifier;
1623
import android.os.Build;
24+
import android.os.Handler;
25+
import android.os.Looper;
26+
import android.support.annotation.NonNull;
1727
import android.util.Log;
28+
import android.widget.Toast;
1829

1930
import com.theta360.lib.PtpipInitiator;
2031
import com.theta360.lib.ThetaException;
2132

2233
import org.deviceconnect.android.deviceplugin.theta.core.ThetaDevice;
2334
import org.deviceconnect.android.deviceplugin.theta.core.ThetaDeviceClient;
2435
import org.deviceconnect.android.deviceplugin.theta.core.ThetaDeviceEventListener;
36+
import org.deviceconnect.android.deviceplugin.theta.core.ThetaDeviceException;
37+
import org.deviceconnect.android.deviceplugin.theta.core.ThetaDeviceFactory;
2538
import org.deviceconnect.android.deviceplugin.theta.core.ThetaDeviceManager;
39+
import org.deviceconnect.android.deviceplugin.theta.core.ThetaV;
2640
import org.deviceconnect.android.deviceplugin.theta.core.wifi.WifiStateEventListener;
2741
import org.deviceconnect.android.deviceplugin.theta.profile.ThetaMediaStreamRecordingProfile;
2842
import org.deviceconnect.android.deviceplugin.theta.profile.ThetaOmnidirectionalImageProfile;
@@ -37,10 +51,14 @@
3751
import org.deviceconnect.android.provider.FileManager;
3852
import org.deviceconnect.android.service.DConnectService;
3953

54+
import java.io.IOException;
55+
import java.net.Socket;
4056
import java.util.ArrayList;
4157
import java.util.List;
4258
import java.util.logging.Logger;
4359

60+
import javax.net.SocketFactory;
61+
4462
/**
4563
* Theta Device Service.
4664
*
@@ -49,6 +67,10 @@
4967
public class ThetaDeviceService extends DConnectMessageService
5068
implements ThetaDeviceEventListener {
5169

70+
public static final String ACTION_CONNECT_WIFI = "action.CONNECT_WIFI";
71+
72+
public static final String EXTRA_SCAN_RESULT = "scanResult";
73+
5274
/** ロガー. */
5375
private final Logger mLogger = Logger.getLogger("theta.dplugin");
5476
private static final String TYPE_NONE = "none";
@@ -79,6 +101,17 @@ public void onReceive(Context context, Intent intent) {
79101
}
80102
}
81103
};
104+
105+
@Override
106+
public int onStartCommand(final Intent intent, final int flags, final int startId) {
107+
int result = super.onStartCommand(intent, flags, startId);
108+
if (intent != null && ACTION_CONNECT_WIFI.equals(intent.getAction())) {
109+
ScanResult scanResult = intent.getParcelableExtra(EXTRA_SCAN_RESULT);
110+
connectWifi(scanResult);
111+
}
112+
return result;
113+
}
114+
82115
@Override
83116
public void onCreate() {
84117
super.onCreate();
@@ -201,4 +234,43 @@ private void resetPluginResource() {
201234
}
202235
}
203236

237+
@TargetApi(Build.VERSION_CODES.Q)
238+
private void connectWifi(final ScanResult result) {
239+
WifiNetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
240+
.setSsid(result.SSID)
241+
.setWpa2Passphrase(parsePassword(result.SSID))
242+
.build();
243+
NetworkRequest request = new NetworkRequest.Builder()
244+
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
245+
.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
246+
.setNetworkSpecifier(specifier)
247+
.build();
248+
requestNetwork(request);
249+
}
250+
251+
@TargetApi(Build.VERSION_CODES.Q)
252+
private boolean requestNetwork(final NetworkRequest request) {
253+
ConnectivityManager connectivityManager = getConnectivityManager();
254+
if (connectivityManager == null) {
255+
return false;
256+
}
257+
final ConnectivityManager.NetworkCallback callback = new ConnectivityManager.NetworkCallback() {
258+
@Override
259+
public void onAvailable(final @NonNull Network network) {
260+
super.onAvailable(network);
261+
262+
Toast.makeText(getApplicationContext(), "onAvailable", Toast.LENGTH_LONG).show();
263+
}
264+
};
265+
connectivityManager.requestNetwork(request, callback, new Handler(Looper.getMainLooper()));
266+
return true;
267+
}
268+
269+
private String parsePassword(final String ssid) {
270+
return ssid.substring(7, 7 + 8);
271+
}
272+
273+
private ConnectivityManager getConnectivityManager() {
274+
return (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
275+
}
204276
}

dConnectDevicePlugin/dConnectDeviceTheta/app/src/main/java/org/deviceconnect/android/deviceplugin/theta/activity/ThetaDeviceActivity.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ public void onCreate(Bundle savedInstanceState) {
7777
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
7878
registerReceiver(mWifiReceiver, filter);
7979
}
80+
8081
@Override
8182
public void onDestroy() {
8283
super.onDestroy();

dConnectDevicePlugin/dConnectDeviceTheta/app/src/main/java/org/deviceconnect/android/deviceplugin/theta/activity/ThetaDeviceSettingsActivity.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*/
77
package org.deviceconnect.android.deviceplugin.theta.activity;
88

9+
import android.os.Build;
910
import android.os.Bundle;
1011
import android.support.v4.app.Fragment;
1112
import android.support.v4.app.FragmentManager;
@@ -15,6 +16,7 @@
1516
import org.deviceconnect.android.deviceplugin.theta.core.ThetaDeviceManager;
1617
import org.deviceconnect.android.deviceplugin.theta.core.ThetaDeviceModel;
1718
import org.deviceconnect.android.deviceplugin.theta.fragment.ConfirmationFragment;
19+
import org.deviceconnect.android.deviceplugin.theta.fragment.ConfirmationFragmentForApi29;
1820
import org.deviceconnect.android.deviceplugin.theta.fragment.MovieModeFragment;
1921
import org.deviceconnect.android.deviceplugin.theta.fragment.PhotoModeFragment;
2022
import org.deviceconnect.android.deviceplugin.theta.fragment.SettingsFragment;
@@ -40,7 +42,7 @@ public class ThetaDeviceSettingsActivity extends DConnectSettingPageFragmentActi
4042
mSummary,
4143
mPhotoMode,
4244
mMovieMode,
43-
new ConfirmationFragment()
45+
Build.VERSION.SDK_INT < Build.VERSION_CODES.Q ? new ConfirmationFragment() : new ConfirmationFragmentForApi29()
4446
};
4547

4648
private ThetaDeviceModel mSelectedModel = ThetaDeviceModel.THETA_S;

dConnectDevicePlugin/dConnectDeviceTheta/app/src/main/java/org/deviceconnect/android/deviceplugin/theta/core/ThetaDeviceFactory.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,20 @@
99

1010
import java.net.InetAddress;
1111

12-
class ThetaDeviceFactory {
12+
import javax.net.SocketFactory;
13+
14+
public class ThetaDeviceFactory {
1315

1416
private static final String DEFAULT_HOST = "192.168.1.1";
1517

1618
private ThetaDeviceFactory() {
1719
}
1820

1921
public static ThetaDevice createDeviceFromAccessPoint(final Context context, final WifiInfo wifiInfo) {
22+
return createDeviceFromAccessPoint(context, wifiInfo, null);
23+
}
24+
25+
public static ThetaDevice createDeviceFromAccessPoint(final Context context, final WifiInfo wifiInfo, final SocketFactory socketFactory) {
2026
String ssId = parseSSID(wifiInfo);
2127
if (ssId == null) {
2228
WifiManager wm = (WifiManager) context.getApplicationContext()
@@ -40,9 +46,9 @@ public static ThetaDevice createDeviceFromAccessPoint(final Context context, fin
4046
return null;
4147
}
4248
case THETA_S:
43-
return new ThetaS(ssId, DEFAULT_HOST);
49+
return new ThetaS(ssId, DEFAULT_HOST, socketFactory);
4450
case THETA_V:
45-
return new ThetaV(ssId, DEFAULT_HOST, null);
51+
return new ThetaV(ssId, DEFAULT_HOST, null, socketFactory);
4652
default:
4753
return null;
4854
}
@@ -63,7 +69,7 @@ public static ThetaDevice createDeviceFromNsdServiceInfo(final NsdServiceInfo se
6369
case THETA_V:
6470
String password = parsePasswordForDigestAuthentication(serviceName);
6571
Credentials credentials = new Credentials(serviceName, password);
66-
return new ThetaV(serviceName, host.getHostAddress(), credentials);
72+
return new ThetaV(serviceName, host.getHostAddress(), credentials, null);
6773
default:
6874
return null;
6975
}

dConnectDevicePlugin/dConnectDeviceTheta/app/src/main/java/org/deviceconnect/android/deviceplugin/theta/core/ThetaS.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import java.util.Iterator;
2222
import java.util.List;
2323

24+
import javax.net.SocketFactory;
25+
2426
class ThetaS extends AbstractThetaDevice {
2527

2628
private static final String ID_PREFIX = "theta-s-";
@@ -55,9 +57,9 @@ class ThetaS extends AbstractThetaDevice {
5557

5658
private OscClient mOscClient;
5759

58-
ThetaS(final String ssId, final String host) {
60+
ThetaS(final String ssId, final String host, final SocketFactory socketFactory) {
5961
super(ssId);
60-
mOscClient = new OscClient(host, null);
62+
mOscClient = new OscClient(host, null, socketFactory);
6163
}
6264

6365
@Override

dConnectDevicePlugin/dConnectDeviceTheta/app/src/main/java/org/deviceconnect/android/deviceplugin/theta/core/ThetaV.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@
2323
import java.util.Iterator;
2424
import java.util.List;
2525

26-
class ThetaV extends AbstractThetaDevice {
26+
import javax.net.SocketFactory;
27+
28+
public class ThetaV extends AbstractThetaDevice {
2729

2830
private static final String ID_PREFIX = "theta-v-";
2931

@@ -59,9 +61,9 @@ class ThetaV extends AbstractThetaDevice {
5961

6062
private OscClient mOscClient;
6163

62-
ThetaV(final String ssId, final String host, final Credentials credentials) {
64+
public ThetaV(final String ssId, final String host, final Credentials credentials, final SocketFactory socketFactory) {
6365
super(ssId);
64-
mOscClient = new OscClient(host, credentials);
66+
mOscClient = new OscClient(host, credentials, socketFactory);
6567
}
6668

6769
@Override

dConnectDevicePlugin/dConnectDeviceTheta/app/src/main/java/org/deviceconnect/android/deviceplugin/theta/core/osc/HttpClient.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import java.io.IOException;
88
import java.util.concurrent.TimeUnit;
99

10+
import javax.net.SocketFactory;
11+
1012
import okhttp3.MediaType;
1113
import okhttp3.OkHttpClient;
1214
import okhttp3.Request;
@@ -20,13 +22,20 @@ class HttpClient {
2022
private final OkHttpClient mOkHttpClient;
2123

2224
public HttpClient(final Credentials credentials) {
25+
this(credentials, null);
26+
}
27+
28+
public HttpClient(final Credentials credentials, final SocketFactory socketFactory) {
2329
OkHttpClient.Builder builder = new OkHttpClient.Builder()
2430
.connectTimeout(60, TimeUnit.SECONDS)
2531
.writeTimeout(60, TimeUnit.SECONDS)
2632
.readTimeout(60, TimeUnit.SECONDS);
2733
if (credentials != null) {
2834
builder.authenticator(new DigestAuthenticator(credentials));
2935
}
36+
if (socketFactory != null) {
37+
builder.socketFactory(socketFactory);
38+
}
3039
mOkHttpClient = builder.build();
3140
}
3241

dConnectDevicePlugin/dConnectDeviceTheta/app/src/main/java/org/deviceconnect/android/deviceplugin/theta/core/osc/OscClient.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import java.io.InputStream;
1212
import java.util.List;
1313

14+
import javax.net.SocketFactory;
15+
1416
public class OscClient {
1517

1618
private static final HttpRequest.Method GET = HttpRequest.Method.GET;
@@ -30,8 +32,8 @@ public class OscClient {
3032
private final HttpClient mHttpClient;
3133
private final String mHost;
3234

33-
public OscClient(final String host, final Credentials credentials) {
34-
mHttpClient = new HttpClient(credentials);
35+
public OscClient(final String host, final Credentials credentials, final SocketFactory socketFactory) {
36+
mHttpClient = new HttpClient(credentials, socketFactory);
3537
mHost = host;
3638
}
3739

0 commit comments

Comments
 (0)