Skip to content

Commit e40a001

Browse files
committed
Added Permission Buttons for Usage Stats and Overlay
1.Removed Permission Request GIF and added two more buttons for usage stats and overlay permissions on permissions screen 2.Replaced usage of Dexter Library for permissions with custom code Signed-off-by: pavan142 <[email protected]>
1 parent e6d9bf0 commit e40a001

File tree

5 files changed

+142
-26
lines changed

5 files changed

+142
-26
lines changed

app/src/main/java/com/frankenstein/screenx/MainActivity.java

Lines changed: 54 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
package com.frankenstein.screenx;
22

33
import android.Manifest;
4-
import android.content.pm.PackageManager;
54
import android.net.Uri;
65
import android.os.Bundle;
76
import android.os.Handler;
7+
import android.os.Looper;
88
import android.provider.Settings;
99
import android.view.View;
1010
import android.widget.AdapterView;
1111
import android.widget.GridView;
1212

13+
import androidx.annotation.NonNull;
1314
import androidx.appcompat.app.AppCompatActivity;
15+
import androidx.core.app.ActivityCompat;
1416
import androidx.core.content.ContextCompat;
1517
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
1618

@@ -44,7 +46,9 @@ public class MainActivity extends AppCompatActivity {
4446
private SwipeRefreshLayout _pullToRefresh;
4547
private View _mProgressBar;
4648
private View _mPermissionsDisplay;
47-
private View _mPermissionsText;
49+
private View _mStoragePermissionsView;
50+
private View _mUsagePermissionsView;
51+
private View _mOverlayPermissionsView;
4852

4953
private boolean _mPermissionsDenied = false;
5054
private Handler _mHandler;
@@ -62,28 +66,50 @@ protected void onCreate(Bundle savedInstanceState) {
6266
utils.setContext(getApplicationContext());
6367
_logger = Logger.getInstance("FILES");
6468
_logger.log("----------MainActivity: ONCREATE---------");
65-
_mHandler = new Handler();
69+
_mHandler = new Handler(Looper.myLooper());
6670
_pullToRefresh = findViewById(R.id.pull_to_refresh);
6771
_pullToRefresh.setOnRefreshListener(() -> refresh());
6872
_mGridView = findViewById(R.id.grid_view);
6973
_sf = ScreenFactory.getInstance();
7074

7175
_mProgressBar = findViewById(R.id.progress_bar);
76+
7277
_mPermissionsDisplay = findViewById(R.id.permissions_display);
7378
_mPermissionsDisplay.setVisibility(View.GONE);
74-
_mPermissionsText = findViewById(R.id.permissions_text);
75-
_mPermissionsText.setOnClickListener(view -> goToAppSettings());
7679

77-
requestStoragePermission();
80+
_mStoragePermissionsView = findViewById(R.id.storage_permissions);
81+
_mStoragePermissionsView.setOnClickListener(view -> goToStorageSettings());
82+
83+
_mUsagePermissionsView = findViewById(R.id.usage_permissions);
84+
_mUsagePermissionsView.setOnClickListener(view -> goToUsageSettings());
85+
86+
_mOverlayPermissionsView = findViewById(R.id.overlay_permissions);
87+
_mOverlayPermissionsView.setOnClickListener(view -> goToOverlaySettings());
88+
89+
checkPermissions();
7890
}
7991

80-
private void goToAppSettings() {
92+
private void goToStorageSettings() {
8193
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
8294
Uri uri = Uri.fromParts("package", getPackageName(), null);
8395
intent.setData(uri);
8496
startActivity(intent);
8597
}
8698

99+
private void goToUsageSettings() {
100+
Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
101+
Uri uri = Uri.fromParts("package", getPackageName(), null);
102+
intent.setData(uri);
103+
startActivity(intent);
104+
}
105+
106+
private void goToOverlaySettings() {
107+
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
108+
Uri uri = Uri.fromParts("package", getPackageName(), null);
109+
intent.setData(uri);
110+
startActivity(intent);
111+
}
112+
87113
private void showProgressBar() {
88114
_mGridView.setAlpha(0);
89115
_mGridView.setVisibility(View.VISIBLE);
@@ -109,9 +135,10 @@ private void hideProgressBar() {
109135
_mGridView.animate().alpha(1).setDuration(PROGRESSBAR_TRANSITION);
110136
_mHandler.postDelayed(() -> _mProgressBar.setVisibility(View.GONE), 1500);
111137
attachAdapter();
138+
112139
}
113140

114-
private void showPermissionDeniedError() {
141+
private void showPermissionRequestScreen() {
115142
_mPermissionsDenied = true;
116143
_mPermissionsDisplay.setVisibility(View.VISIBLE);
117144
_mProgressBar.setVisibility(View.GONE);
@@ -187,27 +214,40 @@ public void onPermissionGranted(PermissionGrantedResponse response) {
187214
@Override
188215
public void onPermissionDenied(PermissionDeniedResponse response) {
189216
_logger.log("Permission Denied");
190-
showPermissionDeniedError();
217+
showPermissionRequestScreen();
191218
}
192219

193220
@Override
194221
public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {
195222
_logger.log("Permission Rational Should be shown");
196-
showPermissionDeniedError();
223+
showPermissionRequestScreen();
197224
token.continuePermissionRequest();
198225
}
199226
})
200227
.onSameThread()
201228
.check();
202229
}
203230

231+
public void checkPermissions() {
232+
boolean storagePermissions = PermissionHelper.hasStoragePermission(this);
233+
boolean usagePermissions = PermissionHelper.hasUsagePermission(this);
234+
boolean overlayPermissions = PermissionHelper.hasOverlayPermission(this);
235+
236+
if (storagePermissions && usagePermissions && overlayPermissions) {
237+
_logger.log(" Have both permissions");
238+
permissionsGranted();
239+
return;
240+
}
241+
242+
_logger.log("the permissions for storage is ", storagePermissions, " usage is", usagePermissions, "overlay is", overlayPermissions);
243+
showPermissionRequestScreen();
244+
}
245+
204246
@Override
205247
public void onWindowFocusChanged(boolean hasFocus) {
206248
super.onWindowFocusChanged(hasFocus);
207-
if (hasFocus && _mPermissionsDenied &&
208-
ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
209-
== PackageManager.PERMISSION_GRANTED) {
210-
permissionsGranted();
249+
if (hasFocus && _mPermissionsDenied) {
250+
checkPermissions();
211251
}
212252
}
213253

app/src/main/java/com/frankenstein/screenx/helper/PermissionHelper.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,37 @@ package com.frankenstein.screenx.helper
88
import android.Manifest
99
import android.annotation.TargetApi
1010
import android.app.Activity
11+
import android.app.AppOpsManager
1112
import android.content.Context
1213
import android.content.pm.PackageManager
1314
import android.os.Build
15+
import android.os.Process
1416
import androidx.core.content.ContextCompat
1517
import androidx.fragment.app.FragmentActivity
1618
import com.frankenstein.screenx.overlay.OverlayPermission
1719

20+
1821
class PermissionHelper {
1922
companion object {
23+
@JvmStatic
2024
fun hasStoragePermission(context: Context) = ContextCompat.checkSelfPermission(context,
2125
Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
2226

27+
@JvmStatic
28+
fun hasUsagePermission(context: Context): Boolean {
29+
var granted = false;
30+
val appOps = context.getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager
31+
val mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS,
32+
Process.myUid(), context.packageName)
33+
34+
granted = if (mode == AppOpsManager.MODE_DEFAULT) {
35+
context.checkCallingOrSelfPermission(Manifest.permission.PACKAGE_USAGE_STATS) === PackageManager.PERMISSION_GRANTED
36+
} else {
37+
mode == AppOpsManager.MODE_ALLOWED
38+
}
39+
return granted;
40+
}
41+
2342
@TargetApi(Build.VERSION_CODES.M)
2443
fun shouldShowStorageRational(activity: FragmentActivity): Boolean {
2544
return activity.shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)

app/src/main/res/layout/appgroup_grid.xml

Lines changed: 58 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,62 @@
4747
android:layout_height="match_parent"
4848
android:id = "@+id/permissions_display"
4949
android:background="@android:color/white">
50-
<RelativeLayout
50+
<LinearLayout
5151
android:layout_width="match_parent"
52-
android:layout_height="match_parent">
53-
<pl.droidsonroids.gif.GifImageView
52+
android:layout_height="match_parent"
53+
android:orientation="vertical">
54+
<!-- <pl.droidsonroids.gif.GifImageView-->
55+
<!-- android:layout_width="wrap_content"-->
56+
<!-- android:layout_centerInParent="true"-->
57+
<!-- android:layout_height="0dp"-->
58+
<!-- android:layout_weight="2"-->
59+
<!-- android:src="@drawable/storage_permissions">-->
60+
<!-- </pl.droidsonroids.gif.GifImageView>-->
61+
<LinearLayout
62+
android:layout_width="match_parent"
63+
android:layout_height="0dp"
64+
android:layout_weight="1"
65+
android:orientation="vertical"
66+
android:padding="0px"
67+
android:gravity="center"
68+
android:layout_centerHorizontal="true"
69+
android:layout_alignParentBottom="true">
70+
71+
<soup.neumorphism.NeumorphCardView
72+
android:layout_width="wrap_content"
73+
android:layout_height="wrap_content"
74+
style="@style/Widget.Neumorph.CardView"
75+
app:neumorph_shadowElevation="6dp"
76+
app:neumorph_lightSource="leftTop"
77+
app:neumorph_shapeType="flat"
78+
app:neumorph_backgroundColor="@color/lightWhite"
79+
android:layout_centerHorizontal="true">
80+
<TextView
81+
android:layout_width="wrap_content"
82+
android:layout_height="wrap_content"
83+
android:padding="30dp"
84+
android:id="@+id/storage_permissions"
85+
android:text="@string/storage_permission_text">
86+
</TextView>
87+
</soup.neumorphism.NeumorphCardView>
88+
<soup.neumorphism.NeumorphCardView
5489
android:layout_width="wrap_content"
5590
android:layout_height="wrap_content"
56-
android:layout_centerInParent="true"
57-
android:src="@drawable/storage_permissions">
58-
</pl.droidsonroids.gif.GifImageView>
91+
style="@style/Widget.Neumorph.CardView"
92+
app:neumorph_shadowElevation="6dp"
93+
app:neumorph_lightSource="leftTop"
94+
app:neumorph_shapeType="flat"
95+
app:neumorph_backgroundColor="@color/lightWhite"
96+
android:layout_centerHorizontal="true"
97+
android:layout_alignParentBottom="true">
98+
<TextView
99+
android:layout_width="wrap_content"
100+
android:layout_height="wrap_content"
101+
android:padding="30dp"
102+
android:id="@+id/usage_permissions"
103+
android:text="@string/usage_permission_text">
104+
</TextView>
105+
</soup.neumorphism.NeumorphCardView>
59106
<soup.neumorphism.NeumorphCardView
60107
android:layout_width="wrap_content"
61108
android:layout_height="wrap_content"
@@ -65,16 +112,16 @@
65112
app:neumorph_shapeType="flat"
66113
app:neumorph_backgroundColor="@color/lightWhite"
67114
android:layout_centerHorizontal="true"
68-
android:layout_alignParentBottom="true"
69-
android:layout_marginBottom="50dp">
115+
android:layout_alignParentBottom="true">
70116
<TextView
71117
android:layout_width="wrap_content"
72118
android:layout_height="wrap_content"
73119
android:padding="30dp"
74-
android:id="@+id/permissions_text"
75-
android:text="@string/permissions_text">
120+
android:id="@+id/overlay_permissions"
121+
android:text="@string/overlay_permission_text">
76122
</TextView>
77123
</soup.neumorphism.NeumorphCardView>
78-
</RelativeLayout>
124+
</LinearLayout>
125+
</LinearLayout>
79126
</FrameLayout>
80127
</RelativeLayout>

app/src/main/res/values/colors.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,12 @@
1313

1414
<!-- Notification -->
1515
<color name="foreground_notification">@color/primaryTeal</color>
16+
17+
<!-- Permission Button Colors-->
18+
<color name="permission_granted_background">#00c8d7</color>
19+
<color name="permission_granted_shadow_dark">#00a8b7</color>
20+
21+
<color name="permission_awaiting_background">#00c8d7</color>
22+
<color name="permission_awaiting_shadow_dark">#9900c8d7</color>
23+
1624
</resources>

app/src/main/res/values/strings.xml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
<string name="nav_header_subtitle">[email protected]</string>
77
<string name="nav_header_desc">Navigation header</string>
88
<string name="action_settings">Settings</string>
9-
<string name="permissions_text">Grant storage permissions</string>
9+
<string name="storage_permission_text">Grant storage permissions</string>
10+
<string name="usage_permission_text">Grant app usage permissions</string>
11+
<string name="overlay_permission_text">Grant overlay permissions</string>
1012
<string name="snackbar_disable">Screenshot feature disabled</string>
1113
<string name="snackbar_enable">Screenshot feature enabled</string>
1214

0 commit comments

Comments
 (0)