Skip to content

Commit 4f97a52

Browse files
committed
Merge branch 'master' of https://github.com/clean-apps/CleanSCAN
2 parents 3495cce + b503235 commit 4f97a52

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+1562
-65
lines changed

app/build.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,5 @@ dependencies {
3333
annotationProcessor "android.arch.persistence.room:compiler:1.0.0"
3434
implementation 'android.arch.lifecycle:extensions:1.1.0'
3535
implementation 'android.arch.lifecycle:viewmodel:1.1.0'
36+
implementation 'com.google.android.gms:play-services-vision:11.8.0'
3637
}

app/src/main/AndroidManifest.xml

+20-18
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
<uses-permission android:name="android.permission.CAMERA" />
66
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
77
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
8+
<uses-permission android:name="android.permission.INTERNET" />
89

910
<application
1011
android:allowBackup="true"
@@ -13,19 +14,7 @@
1314
android:roundIcon="@mipmap/ic_launcher_round"
1415
android:supportsRtl="true"
1516
android:theme="@style/AppTheme">
16-
17-
<activity android:name=".SearchableActivity"
18-
android:theme="@style/AppThemeSearch"
19-
android:parentActivityName=".MainActivity"
20-
android:launchMode="singleTop" >
21-
22-
<intent-filter>
23-
<action android:name="android.intent.action.SEARCH" />
24-
</intent-filter>
25-
<meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/>
26-
27-
</activity>
28-
17+
<activity android:name=".IntroActivity"></activity>
2918
<activity
3019
android:name=".SplashScreen"
3120
android:theme="@style/AppThemeSplash">
@@ -38,18 +27,31 @@
3827
<meta-data
3928
android:name="android.app.shortcuts"
4029
android:resource="@xml/shortcuts" />
41-
4230
<meta-data
4331
android:name="com.google.firebase.ml.vision.DEPENDENCIES"
4432
android:value="ocr" />
45-
4633
</activity>
47-
4834
<activity android:name=".MainActivity">
4935
<meta-data
50-
android:name="android.app.default_searchable"
51-
android:value=".SearchableActivity" />
36+
android:name="com.google.android.gms.vision.DEPENDENCIES"
37+
android:value="ocr" />
38+
</activity>
39+
<activity
40+
android:name=".SearchableActivity"
41+
android:launchMode="singleTop"
42+
android:parentActivityName=".MainActivity"
43+
android:theme="@style/AppThemeSearch">
44+
<intent-filter>
45+
<action android:name="android.intent.action.SEARCH" />
46+
</intent-filter>
47+
48+
<meta-data
49+
android:name="android.app.searchable"
50+
android:resource="@xml/searchable" />
5251
</activity>
52+
<activity
53+
android:name=".OCRActivity"
54+
android:parentActivityName=".MainActivity"></activity>
5355

5456
<provider
5557
android:name="android.support.v4.content.FileProvider"

app/src/main/ic_launcher-web.png

12.1 KB
Loading
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
package com.babanomania.pdfscanner;
2+
3+
import android.content.Intent;
4+
import android.content.SharedPreferences;
5+
import android.support.design.widget.TabLayout;
6+
import android.support.v4.view.ViewPager;
7+
import android.support.v7.app.AppCompatActivity;
8+
import android.os.Bundle;
9+
import android.view.View;
10+
import android.view.Window;
11+
import android.view.WindowManager;
12+
import android.view.animation.Animation;
13+
import android.view.animation.AnimationUtils;
14+
import android.widget.Button;
15+
import android.widget.TextView;
16+
17+
import com.babanomania.pdfscanner.intro.IntroItem;
18+
import com.babanomania.pdfscanner.intro.IntroViewPagerAdapter;
19+
import com.babanomania.pdfscanner.utils.UIUtil;
20+
21+
import java.util.ArrayList;
22+
import java.util.List;
23+
24+
public class IntroActivity extends AppCompatActivity {
25+
26+
private ViewPager screenPager;
27+
IntroViewPagerAdapter introViewPagerAdapter ;
28+
TabLayout tabIndicator;
29+
Button btnNext;
30+
int position = 0 ;
31+
Button btnGetStarted;
32+
Animation btnAnim ;
33+
TextView tvSkip;
34+
35+
@Override
36+
protected void onCreate(Bundle savedInstanceState) {
37+
super.onCreate(savedInstanceState);
38+
39+
// make the activity on full screen
40+
requestWindowFeature(Window.FEATURE_NO_TITLE);
41+
getWindow().setFlags(
42+
WindowManager.LayoutParams.FLAG_FULLSCREEN,
43+
WindowManager.LayoutParams.FLAG_FULLSCREEN
44+
);
45+
46+
UIUtil.setWhiteNavigationBar( findViewById(android.R.id.content), this );
47+
48+
setContentView(R.layout.activity_intro);
49+
50+
// hide the action bar
51+
getSupportActionBar().hide();
52+
53+
// ini views
54+
btnNext = findViewById(R.id.btn_next);
55+
btnGetStarted = findViewById(R.id.btn_get_started);
56+
tabIndicator = findViewById(R.id.tab_indicator);
57+
btnAnim = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.button_animation);
58+
tvSkip = findViewById(R.id.tv_skip);
59+
60+
// fill list screen
61+
final List<IntroItem> mList = new ArrayList<>();
62+
mList.add(new IntroItem( getResources().getString(R.string.intro_title1),
63+
getResources().getString(R.string.intro_desc1),
64+
R.drawable.ic_intro1));
65+
66+
mList.add(new IntroItem( getResources().getString(R.string.intro_title2),
67+
getResources().getString(R.string.intro_desc2),
68+
R.drawable.ic_intro2));
69+
70+
mList.add(new IntroItem( getResources().getString(R.string.intro_title3),
71+
getResources().getString(R.string.intro_desc3),
72+
R.drawable.ic_intro3));
73+
74+
// setup viewpager
75+
screenPager =findViewById(R.id.screen_viewpager);
76+
introViewPagerAdapter = new IntroViewPagerAdapter(this,mList);
77+
screenPager.setAdapter(introViewPagerAdapter);
78+
79+
// setup tablayout with viewpager
80+
tabIndicator.setupWithViewPager(screenPager);
81+
82+
// next button click Listener
83+
btnNext.setOnClickListener(new View.OnClickListener() {
84+
@Override
85+
public void onClick(View v) {
86+
87+
position = screenPager.getCurrentItem();
88+
if (position < mList.size()) {
89+
position++;
90+
screenPager.setCurrentItem(position);
91+
}
92+
93+
if (position == mList.size()-1) { // when we reach to the last screen
94+
loaddLastScreen();
95+
}
96+
97+
}
98+
});
99+
100+
// tablayout add change listener
101+
tabIndicator.addOnTabSelectedListener(new TabLayout.BaseOnTabSelectedListener() {
102+
@Override
103+
public void onTabSelected(TabLayout.Tab tab) {
104+
105+
if (tab.getPosition() == mList.size()-1) {
106+
loaddLastScreen();
107+
}
108+
}
109+
110+
@Override
111+
public void onTabUnselected(TabLayout.Tab tab) {}
112+
113+
@Override
114+
public void onTabReselected(TabLayout.Tab tab) {}
115+
});
116+
117+
// Get Started button click listener
118+
btnGetStarted.setOnClickListener(new View.OnClickListener() {
119+
@Override
120+
public void onClick(View v) {
121+
122+
//open main activity
123+
Intent mainActivity = new Intent(getApplicationContext(),MainActivity.class);
124+
125+
startActivity(mainActivity);
126+
// also we need to save a boolean value to storage so next time when the user run the app
127+
// we could know that he is already checked the intro screen activity
128+
// i'm going to use shared preferences to that process
129+
savePrefsData();
130+
finish();
131+
132+
}
133+
});
134+
135+
// skip button click listener
136+
tvSkip.setOnClickListener(new View.OnClickListener() {
137+
@Override
138+
public void onClick(View v) {
139+
//open main activity
140+
Intent mainActivity = new Intent(getApplicationContext(),MainActivity.class);
141+
142+
startActivity(mainActivity);
143+
// also we need to save a boolean value to storage so next time when the user run the app
144+
// we could know that he is already checked the intro screen activity
145+
// i'm going to use shared preferences to that process
146+
savePrefsData();
147+
finish();
148+
}
149+
});
150+
}
151+
152+
private void savePrefsData() {
153+
SharedPreferences pref = getApplicationContext().getSharedPreferences("myPrefs",MODE_PRIVATE);
154+
SharedPreferences.Editor editor = pref.edit();
155+
editor.putBoolean("isIntroOpnend",true);
156+
editor.commit();
157+
}
158+
159+
// show the GETSTARTED Button and hide the indicator and the next button
160+
private void loaddLastScreen() {
161+
162+
btnNext.setVisibility(View.INVISIBLE);
163+
btnGetStarted.setVisibility(View.VISIBLE);
164+
tvSkip.setVisibility(View.INVISIBLE);
165+
tabIndicator.setVisibility(View.INVISIBLE);
166+
// TODO : ADD an animation the getstarted button
167+
// setup animation
168+
btnGetStarted.setAnimation(btnAnim);
169+
170+
171+
172+
}
173+
}

app/src/main/java/com/babanomania/pdfscanner/MainActivity.java

+20-1
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,14 @@
1818
import android.support.v7.widget.DividerItemDecoration;
1919
import android.support.v7.widget.LinearLayoutManager;
2020
import android.support.v7.widget.RecyclerView;
21+
import android.util.Log;
22+
import android.util.SparseArray;
23+
import android.widget.LinearLayout;
2124
import android.widget.SearchView;
2225
import android.view.Menu;
2326
import android.view.MenuItem;
2427
import android.view.View;
28+
import android.widget.Toast;
2529

2630
import com.babanomania.pdfscanner.persistance.DocumentViewModel;
2731
import com.babanomania.pdfscanner.persistance.Document;
@@ -30,9 +34,13 @@
3034
import com.babanomania.pdfscanner.fileView.FLAdapter;
3135
import com.babanomania.pdfscanner.utils.FileIOUtils;
3236
import com.babanomania.pdfscanner.utils.FileWritingCallback;
37+
import com.babanomania.pdfscanner.utils.OCRUtils;
3338
import com.babanomania.pdfscanner.utils.PDFWriterUtil;
3439
import com.babanomania.pdfscanner.utils.PermissionUtil;
3540
import com.babanomania.pdfscanner.utils.UIUtil;
41+
import com.google.android.gms.vision.Frame;
42+
import com.google.android.gms.vision.text.TextBlock;
43+
import com.google.android.gms.vision.text.TextRecognizer;
3644
import com.scanlibrary.ScanActivity;
3745
import com.scanlibrary.ScanConstants;
3846

@@ -50,6 +58,7 @@ public class MainActivity extends AppCompatActivity {
5058
private List<Uri> scannedBitmaps = new ArrayList<>();
5159

5260
private DocumentViewModel viewModel;
61+
private LinearLayout emptyLayout;
5362

5463
private String searchText = "";
5564
LiveData<List<Document>> liveData;
@@ -73,6 +82,8 @@ protected void onCreate(Bundle savedInstanceState) {
7382
final String baseStagingDirectory = getApplicationContext().getString( R.string.base_staging_path);
7483
FileIOUtils.mkdir( baseStagingDirectory );
7584

85+
this.emptyLayout = findViewById(R.id.empty_list);
86+
7687
viewModel = ViewModelProviders.of(this).get(DocumentViewModel.class);
7788

7889
fileAdapter = new FLAdapter( viewModel, this);
@@ -82,6 +93,14 @@ protected void onCreate(Bundle savedInstanceState) {
8293
liveData.observe(this, new Observer<List<Document>>() {
8394
@Override
8495
public void onChanged(@Nullable List<Document> documents) {
96+
97+
if( documents.size() > 0 ){
98+
emptyLayout.setVisibility(View.GONE);
99+
100+
} else {
101+
emptyLayout.setVisibility(View.VISIBLE);
102+
}
103+
85104
fileAdapter.setData(documents);
86105
}
87106
});
@@ -121,7 +140,7 @@ public void openGallery(View v){
121140

122141
private void saveBitmap( final Bitmap bitmap, final boolean addMore ){
123142

124-
final String baseDirectory = getApplicationContext().getString( addMore ? R.string.base_staging_path : R.string.base_storage_path);
143+
final String baseDirectory = getApplicationContext().getString( addMore ? R.string.base_staging_path : R.string.base_storage_path);
125144
final File sd = Environment.getExternalStorageDirectory();
126145

127146
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy_hh-mm-ss");

0 commit comments

Comments
 (0)