From 1028a2ba7394639d9520237c0ae415d61e8927e4 Mon Sep 17 00:00:00 2001 From: Veli Date: Thu, 25 Jan 2018 01:58:34 +0300 Subject: [PATCH] fixed issue causing the app crash --- app/build.gradle | 4 +- app/release/output.json | 2 +- .../com/genonbeta/CoolSocket/CoolSocket.java | 3 +- .../TrebleShot/adapter/FileListAdapter.java | 1 - .../genonbeta/TrebleShot/app/Activity.java | 75 +++++++++++---- .../dialog/RationalePermissionRequest.java | 91 +++++++++++-------- .../fragment/NetworkDeviceListFragment.java | 5 +- .../service/CommunicationService.java | 20 ++-- .../service/DeviceScannerService.java | 2 +- .../genonbeta/TrebleShot/util/AppUtils.java | 10 ++ .../TrebleShot/util/NsdDiscovery.java | 18 +++- .../widget/EditableListAdapter.java | 2 - 12 files changed, 154 insertions(+), 79 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 87845c93..87ff995b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "com.genonbeta.TrebleShot" minSdkVersion 14 targetSdkVersion 26 - versionCode 57 - versionName "1.2.5.2" + versionCode 58 + versionName "1.2.5.3" } lintOptions { diff --git a/app/release/output.json b/app/release/output.json index 02f14f78..cb51e0c9 100644 --- a/app/release/output.json +++ b/app/release/output.json @@ -1 +1 @@ -[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":56},"path":"app-release.apk","properties":{"packageId":"com.genonbeta.TrebleShot","split":"","minSdkVersion":"14"}}] \ No newline at end of file +[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":57},"path":"app-release.apk","properties":{"packageId":"com.genonbeta.TrebleShot","split":"","minSdkVersion":"14"}}] \ No newline at end of file diff --git a/app/src/main/java/com/genonbeta/CoolSocket/CoolSocket.java b/app/src/main/java/com/genonbeta/CoolSocket/CoolSocket.java index c2ef2a58..c26cece3 100644 --- a/app/src/main/java/com/genonbeta/CoolSocket/CoolSocket.java +++ b/app/src/main/java/com/genonbeta/CoolSocket/CoolSocket.java @@ -128,7 +128,8 @@ public boolean isComponentsReady() public boolean isInterrupted() { - return this.getServerThread().isInterrupted(); + return this.getServerThread() == null || + this.getServerThread().isInterrupted(); } public boolean isServerAlive() diff --git a/app/src/main/java/com/genonbeta/TrebleShot/adapter/FileListAdapter.java b/app/src/main/java/com/genonbeta/TrebleShot/adapter/FileListAdapter.java index f9d32a54..cf02d63f 100644 --- a/app/src/main/java/com/genonbeta/TrebleShot/adapter/FileListAdapter.java +++ b/app/src/main/java/com/genonbeta/TrebleShot/adapter/FileListAdapter.java @@ -218,7 +218,6 @@ public static class FileHolder extends Shareable public FileHolder(String friendlyName, String fileInfo, File file, boolean isFolder) { - // FIXME: 18.01.2018 Folder may not have super(friendlyName, friendlyName, file.lastModified(), file.length(), Uri.fromFile(file)); this.fileInfo = fileInfo; diff --git a/app/src/main/java/com/genonbeta/TrebleShot/app/Activity.java b/app/src/main/java/com/genonbeta/TrebleShot/app/Activity.java index 4be6463e..057d2bcc 100644 --- a/app/src/main/java/com/genonbeta/TrebleShot/app/Activity.java +++ b/app/src/main/java/com/genonbeta/TrebleShot/app/Activity.java @@ -6,6 +6,8 @@ import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; +import android.support.annotation.NonNull; +import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import com.genonbeta.TrebleShot.R; @@ -13,32 +15,18 @@ import com.genonbeta.TrebleShot.service.CommunicationService; import com.genonbeta.TrebleShot.util.AppUtils; +import java.util.ArrayList; + public abstract class Activity extends AppCompatActivity { private SharedPreferences mPreferences; + private AlertDialog mOngoingRequest; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - PreferenceManager.setDefaultValues(this, R.xml.preferences_main, false); - - if (Build.VERSION.SDK_INT >= 16) { - RationalePermissionRequest storagePermission = new RationalePermissionRequest(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); - - storagePermission.setTitle(R.string.text_requestPermissionStorage); - storagePermission.setMessage(R.string.text_requestPermissionStorageSummary); - storagePermission.show(); - } - - if (Build.VERSION.SDK_INT >= 26) { - RationalePermissionRequest readPhonePermission = new RationalePermissionRequest(this, Manifest.permission.READ_PHONE_STATE); - - readPhonePermission.setTitle(R.string.text_requestPermissionReadPhoneState); - readPhonePermission.setMessage(R.string.text_requestPermissionReadPhoneStateSummary); - readPhonePermission.show(); - } } @Override @@ -48,6 +36,26 @@ protected void onStart() AppUtils.startForegroundService(this, new Intent(this, CommunicationService.class)); } + @Override + protected void onResume() + { + super.onResume(); + + if (!AppUtils.checkRunningConditions(this)) + requestRequiredPermissions(); + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) + { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + + if (AppUtils.checkRunningConditions(this)) + AppUtils.startForegroundService(this, new Intent(this, CommunicationService.class)); + else + requestRequiredPermissions(); + } + protected SharedPreferences getDefaultPreferences() { if (mPreferences == null) @@ -55,4 +63,37 @@ protected SharedPreferences getDefaultPreferences() return mPreferences; } + + public ArrayList getRequiredPermissions() + { + ArrayList permissionRequests = new ArrayList<>(); + + if (Build.VERSION.SDK_INT >= 16) { + permissionRequests.add(new RationalePermissionRequest.PermissionRequest(this, + Manifest.permission.WRITE_EXTERNAL_STORAGE, + R.string.text_requestPermissionStorage, + R.string.text_requestPermissionStorageSummary)); + } + + if (Build.VERSION.SDK_INT >= 26) { + permissionRequests.add(new RationalePermissionRequest.PermissionRequest(this, + Manifest.permission.READ_PHONE_STATE, + R.string.text_requestPermissionReadPhoneState, + R.string.text_requestPermissionReadPhoneStateSummary)); + } + + return permissionRequests; + } + + public boolean requestRequiredPermissions() + { + if (mOngoingRequest != null && mOngoingRequest.isShowing()) + return false; + + for (RationalePermissionRequest.PermissionRequest request : getRequiredPermissions()) + if ((mOngoingRequest = RationalePermissionRequest.requestIfNecessary(this, request)) != null) + return false; + + return true; + } } diff --git a/app/src/main/java/com/genonbeta/TrebleShot/dialog/RationalePermissionRequest.java b/app/src/main/java/com/genonbeta/TrebleShot/dialog/RationalePermissionRequest.java index f3718e62..094260a2 100644 --- a/app/src/main/java/com/genonbeta/TrebleShot/dialog/RationalePermissionRequest.java +++ b/app/src/main/java/com/genonbeta/TrebleShot/dialog/RationalePermissionRequest.java @@ -1,5 +1,6 @@ package com.genonbeta.TrebleShot.dialog; +import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; @@ -21,60 +22,74 @@ public class RationalePermissionRequest extends AlertDialog.Builder { - public Activity mActivity; - public String mPermission; + public PermissionRequest mPermissionQueue; - public RationalePermissionRequest(Activity activity, @NonNull String permission) + public RationalePermissionRequest(final Activity activity, @NonNull PermissionRequest permission) { super(activity); - mActivity = activity; - mPermission = permission; + mPermissionQueue = permission; setCancelable(false); - setTitle(R.string.text_permissionRequest); - } + setTitle(permission.title); + setMessage(permission.message); - @Override - public AlertDialog show() - { - if (ActivityCompat.checkSelfPermission(mActivity, mPermission) != PackageManager.PERMISSION_GRANTED) { - if (ActivityCompat.shouldShowRequestPermissionRationale(mActivity, mPermission)) - setPositiveButton(R.string.butn_settings, new DialogInterface.OnClickListener() - { - @Override - public void onClick(DialogInterface dialogInterface, int i) - { - Intent intent = new Intent() - .setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) - .setData(Uri.fromParts("package", mActivity.getPackageName(), null)); - - mActivity.startActivity(intent); - mActivity.finish(); - } - }); - else - setPositiveButton(R.string.butn_ask, new DialogInterface.OnClickListener() + if (ActivityCompat.shouldShowRequestPermissionRationale(activity, mPermissionQueue.permission)) + setPositiveButton(R.string.butn_settings, new DialogInterface.OnClickListener() + { + @Override + public void onClick(DialogInterface dialogInterface, int i) { - @Override - public void onClick(DialogInterface dialogInterface, int i) - { - ActivityCompat.requestPermissions(mActivity, new String[]{mPermission}, REQUEST_PERMISSION_ALL); - } - }); + Intent intent = new Intent() + .setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + .setData(Uri.fromParts("package", activity.getPackageName(), null)); - setNegativeButton(R.string.butn_reject, new DialogInterface.OnClickListener() + activity.startActivity(intent); + } + }); + else + setPositiveButton(R.string.butn_ask, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { - mActivity.finish(); + ActivityCompat.requestPermissions(activity, new String[]{mPermissionQueue.permission}, REQUEST_PERMISSION_ALL); } }); - super.show(); + setNegativeButton(R.string.butn_reject, new DialogInterface.OnClickListener() + { + @Override + public void onClick(DialogInterface dialogInterface, int i) + { + activity.finish(); + } + }); + } + + public static AlertDialog requestIfNecessary(Activity activity, PermissionRequest permissionQueue) + { + return ActivityCompat.checkSelfPermission(activity, permissionQueue.permission) == PackageManager.PERMISSION_GRANTED + ? null + : new RationalePermissionRequest(activity, permissionQueue).show(); + } + + public static class PermissionRequest + { + public String permission; + public String title; + public String message; + + public PermissionRequest(String permission, String title, String message) + { + this.permission = permission; + this.title = title; + this.message = message; } - return null; + public PermissionRequest(Context context, String permission, int titleRes, int messageRes) + { + this(permission, context.getString(titleRes), context.getString(messageRes)); + } } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/genonbeta/TrebleShot/fragment/NetworkDeviceListFragment.java b/app/src/main/java/com/genonbeta/TrebleShot/fragment/NetworkDeviceListFragment.java index f8f158ca..22628875 100644 --- a/app/src/main/java/com/genonbeta/TrebleShot/fragment/NetworkDeviceListFragment.java +++ b/app/src/main/java/com/genonbeta/TrebleShot/fragment/NetworkDeviceListFragment.java @@ -25,6 +25,7 @@ import android.support.v4.content.ContextCompat; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.AlertDialog; +import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -514,8 +515,10 @@ public void onClick(View v) else if (NetworkStatusReceiver.WIFI_AP_STATE_CHANGED.equals(intent.getAction())) updateHotspotState(); else if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction()) - && WifiManager.WIFI_STATE_ENABLED == intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, -1)) + && WifiManager.WIFI_STATE_ENABLED == intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, -1)) { + Log.d(TAG, "Fragment you bitvh"); requestRefresh(); + } } } } diff --git a/app/src/main/java/com/genonbeta/TrebleShot/service/CommunicationService.java b/app/src/main/java/com/genonbeta/TrebleShot/service/CommunicationService.java index 5c708a0f..d5e4bb25 100644 --- a/app/src/main/java/com/genonbeta/TrebleShot/service/CommunicationService.java +++ b/app/src/main/java/com/genonbeta/TrebleShot/service/CommunicationService.java @@ -107,11 +107,6 @@ public void onCreate() { super.onCreate(); - if (!mCommunicationServer.start() || !mSeamlessServer.start()) { - stopSelf(); - return; - } - mNotificationUtils = new NotificationUtils(this); mDatabase = new AccessDatabase(this); mNsdDiscovery = new NsdDiscovery(getApplicationContext(), getDatabase()); @@ -126,9 +121,13 @@ public void onCreate() mMediaScanner.connect(); mNsdDiscovery.registerService(); - getWifiLock().acquire(); updateServiceState(getNotificationUtils().getPreferences().getBoolean("trust_always", false)); + + if (!AppUtils.checkRunningConditions(this) + || !mCommunicationServer.start() + || !mSeamlessServer.start()) + stopSelf(); } @Override @@ -139,7 +138,7 @@ public int onStartCommand(Intent intent, int flags, int startId) if (intent != null) Log.d(TAG, "onStart() : action = " + intent.getAction()); - if (intent != null) { + if (intent != null && AppUtils.checkRunningConditions(this)) { if (ACTION_FILE_TRANSFER.equals(intent.getAction())) { final int groupId = intent.getIntExtra(EXTRA_GROUP_ID, -1); final int notificationId = intent.getIntExtra(NotificationUtils.EXTRA_NOTIFICATION_ID, -1); @@ -205,8 +204,8 @@ public void onConnect(CoolSocket.Client connect) return START_NOT_STICKY; } } else if (ACTION_CANCEL_INDEXING.equals(intent.getAction())) { - final int notificationId = intent.getIntExtra(NotificationUtils.EXTRA_NOTIFICATION_ID, -1); - final int groupId = intent.getIntExtra(EXTRA_GROUP_ID, -1); + int notificationId = intent.getIntExtra(NotificationUtils.EXTRA_NOTIFICATION_ID, -1); + int groupId = intent.getIntExtra(EXTRA_GROUP_ID, -1); mNotificationUtils.cancel(notificationId); @@ -304,7 +303,8 @@ public void onDestroy() if (getHotspotUtils().unloadPreviousConfig()) getHotspotUtils().disable(); - getWifiLock().release(); + if (getWifiLock().isHeld()) + getWifiLock().release(); stopForeground(true); } diff --git a/app/src/main/java/com/genonbeta/TrebleShot/service/DeviceScannerService.java b/app/src/main/java/com/genonbeta/TrebleShot/service/DeviceScannerService.java index c51b5fd5..38925a71 100644 --- a/app/src/main/java/com/genonbeta/TrebleShot/service/DeviceScannerService.java +++ b/app/src/main/java/com/genonbeta/TrebleShot/service/DeviceScannerService.java @@ -45,7 +45,7 @@ public int onStartCommand(Intent intent, int flags, int startId) { super.onStartCommand(intent, flags, startId); - if (intent != null) + if (intent != null && AppUtils.checkRunningConditions(this)) if (ACTION_SCAN_DEVICES.equals(intent.getAction())) { String result = SCANNER_NOT_AVAILABLE; diff --git a/app/src/main/java/com/genonbeta/TrebleShot/util/AppUtils.java b/app/src/main/java/com/genonbeta/TrebleShot/util/AppUtils.java index 27fb69e1..854784c2 100644 --- a/app/src/main/java/com/genonbeta/TrebleShot/util/AppUtils.java +++ b/app/src/main/java/com/genonbeta/TrebleShot/util/AppUtils.java @@ -10,14 +10,24 @@ import android.support.v4.app.ActivityCompat; import com.genonbeta.TrebleShot.config.AppConfig; +import com.genonbeta.TrebleShot.dialog.RationalePermissionRequest; import com.genonbeta.TrebleShot.object.NetworkDevice; +import java.util.ArrayList; + public class AppUtils { public static final String TAG = AppUtils.class.getSimpleName(); private static int mUniqueNumber = 0; + public static boolean checkRunningConditions(Context context) + { + return ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED + && (Build.VERSION.SDK_INT < 26 + || ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED); + } + public static String getHotspotName(Context context) { String apName = AppUtils.getLocalDeviceName(context) diff --git a/app/src/main/java/com/genonbeta/TrebleShot/util/NsdDiscovery.java b/app/src/main/java/com/genonbeta/TrebleShot/util/NsdDiscovery.java index 80c88c5c..ae433ed8 100644 --- a/app/src/main/java/com/genonbeta/TrebleShot/util/NsdDiscovery.java +++ b/app/src/main/java/com/genonbeta/TrebleShot/util/NsdDiscovery.java @@ -62,13 +62,13 @@ public void onStopDiscoveryFailed(String serviceType, int errorCode) @Override public void onDiscoveryStarted(String serviceType) { - Log.e(TAG, "NSD discovery started"); + Log.v(TAG, "NSD discovery started"); } @Override public void onDiscoveryStopped(String serviceType) { - Log.e(TAG, "NSD discovery stopped"); + Log.v(TAG, "NSD discovery stopped"); } @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN) @@ -91,7 +91,7 @@ public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) @Override public void onServiceResolved(NsdServiceInfo serviceInfo) { - Log.w(TAG, "Resolved with success " + serviceInfo.getServiceName()); + Log.v(TAG, "Resolved with success " + serviceInfo.getServiceName()); NetworkDeviceInfoLoader.load(getDatabase(), serviceInfo.getHost().getHostAddress(), null); } @@ -178,12 +178,20 @@ public void startDiscovering() public void stopDiscovering() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) - getNsdManager().stopServiceDiscovery(getDiscoveryListener()); + try { + getNsdManager().stopServiceDiscovery(getDiscoveryListener()); + } catch (IllegalArgumentException e) { + // Listener may not have been initialized + } } public void unregisterService() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) - getNsdManager().unregisterService(getRegistrationListener()); + try { + getNsdManager().unregisterService(getRegistrationListener()); + } catch (IllegalArgumentException e) { + // Listener may not have been initialized + } } } diff --git a/app/src/main/java/com/genonbeta/TrebleShot/widget/EditableListAdapter.java b/app/src/main/java/com/genonbeta/TrebleShot/widget/EditableListAdapter.java index 77d4827e..aba6471f 100644 --- a/app/src/main/java/com/genonbeta/TrebleShot/widget/EditableListAdapter.java +++ b/app/src/main/java/com/genonbeta/TrebleShot/widget/EditableListAdapter.java @@ -65,8 +65,6 @@ public int compare(T toCompare, T compareTo) break; } - Log.d("Result", "res " + sortingResult); - return sortingResult; }