Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
M
meser
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Muhammad Suryono
meser
Commits
5e2c7278
Commit
5e2c7278
authored
Sep 02, 2020
by
fauzi
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/dev' into cart
parents
5c812be5
a18435d0
Show whitespace changes
Inline
Side-by-side
Showing
21 changed files
with
634 additions
and
26 deletions
+634
-26
misc.xml
.idea/misc.xml
+1
-1
AndroidManifest.xml
app/src/main/AndroidManifest.xml
+5
-6
LoginState.java
app/src/main/java/com/yono/messeripos/LoginState.java
+6
-5
MainActivity.java
app/src/main/java/com/yono/messeripos/MainActivity.java
+1
-1
RegisterState.java
app/src/main/java/com/yono/messeripos/RegisterState.java
+31
-3
TransactionActivity.java
...rc/main/java/com/yono/messeripos/TransactionActivity.java
+17
-0
TabAdapterTransaction.java
...va/com/yono/messeripos/adapter/TabAdapterTransaction.java
+42
-0
MainViewModels.java
.../main/java/com/yono/messeripos/models/MainViewModels.java
+4
-3
UsersModels.java
...src/main/java/com/yono/messeripos/models/UsersModels.java
+16
-2
NdefMessageParser.java
...ava/com/yono/messeripos/nfc/parser/NdefMessageParser.java
+44
-0
ParsedNdefRecord.java
...java/com/yono/messeripos/nfc/record/ParsedNdefRecord.java
+5
-0
SmartPoster.java
...main/java/com/yono/messeripos/nfc/record/SmartPoster.java
+186
-0
TextRecord.java
.../main/java/com/yono/messeripos/nfc/record/TextRecord.java
+76
-0
UriRecord.java
...c/main/java/com/yono/messeripos/nfc/record/UriRecord.java
+120
-0
TransactionSuccess.java
...om/yono/messeripos/transactiontab/TransactionSuccess.java
+21
-0
activity_list_transaction.xml
app/src/main/res/layout/activity_list_transaction.xml
+27
-0
home.xml
app/src/main/res/menu/home.xml
+6
-0
dimens.xml
app/src/main/res/values-w820dp/dimens.xml
+6
-0
dimens.xml
app/src/main/res/values/dimens.xml
+8
-0
strings.xml
app/src/main/res/values/strings.xml
+3
-0
styles.xml
app/src/main/res/values/styles.xml
+9
-5
No files found.
.idea/misc.xml
View file @
5e2c7278
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<project
version=
"4"
>
<project
version=
"4"
>
<component
name=
"ProjectRootManager"
version=
"2"
languageLevel=
"JDK_1_8"
project-jdk-name=
"
JDK
"
project-jdk-type=
"JavaSDK"
>
<component
name=
"ProjectRootManager"
version=
"2"
languageLevel=
"JDK_1_8"
project-jdk-name=
"
1.8
"
project-jdk-type=
"JavaSDK"
>
<output
url=
"file://$PROJECT_DIR$/build/classes"
/>
<output
url=
"file://$PROJECT_DIR$/build/classes"
/>
</component>
</component>
<component
name=
"ProjectType"
>
<component
name=
"ProjectType"
>
...
...
app/src/main/AndroidManifest.xml
View file @
5e2c7278
...
@@ -5,11 +5,10 @@
...
@@ -5,11 +5,10 @@
<uses-permission
android:name=
"android.permission.INTERNET"
/>
<uses-permission
android:name=
"android.permission.INTERNET"
/>
<uses-permission
android:name=
"android.permission.READ_EXTERNAL_STORAGE"
/>
<uses-permission
android:name=
"android.permission.READ_EXTERNAL_STORAGE"
/>
<uses-permission
android:name=
"android.permission.WRITE_EXTERNAL_STORAGE"
/>
<uses-permission
android:name=
"android.permission.WRITE_EXTERNAL_STORAGE"
/>
<!-- NFC PERMISSION AND FEATURE -->
<!--NFC PERMISSION AND FEATURE-->
<uses-permission
android:name=
"android.permission.NFC"
/>
<uses-permission
android:name=
"android.permission.NFC"
/>
<uses-feature
android:name=
"android.hardware.nfc"
/>
<uses-feature
android:name=
"android.hardware.nfc"
/>
<uses-feature
<uses-feature
android:name=
"android.hardware.camera"
android:name=
"android.hardware.camera"
android:required=
"true"
/>
android:required=
"true"
/>
...
@@ -21,11 +20,11 @@
...
@@ -21,11 +20,11 @@
android:roundIcon=
"@mipmap/ic_launcher_new_icon"
android:roundIcon=
"@mipmap/ic_launcher_new_icon"
android:supportsRtl=
"true"
android:supportsRtl=
"true"
android:theme=
"@style/AppTheme.appbar"
>
android:theme=
"@style/AppTheme.appbar"
>
<activity
android:name=
".RegisterActivity"
></activity>
<activity
android:name=
".RegisterActivity"
/>
<activity
android:name=
".TransactionActivity"
/>
<activity
<activity
android:name=
".BottomSheets"
android:name=
".BottomSheets"
tools:ignore=
"Instantiatable"
/>
tools:ignore=
"Instantiatable"
/>
<activity
android:name=
".PaymentCreated"
/>
<activity
<activity
android:name=
".HistoryActivity"
android:name=
".HistoryActivity"
android:theme=
"@style/AppTheme.appbar"
/>
android:theme=
"@style/AppTheme.appbar"
/>
...
...
app/src/main/java/com/yono/messeripos/LoginState.java
View file @
5e2c7278
...
@@ -166,12 +166,13 @@ public class LoginState extends BottomSheetDialogFragment {
...
@@ -166,12 +166,13 @@ public class LoginState extends BottomSheetDialogFragment {
* Jika response atau data ada dan cocok
* Jika response atau data ada dan cocok
*/
*/
if
(
usersModelsDataResponse
.
getStatusData
())
{
if
(
usersModelsDataResponse
.
getStatusData
())
{
// SharedPreferences.Editor editor = sharedPreferences.edit();
SharedPreferences
.
Editor
editor
=
sharedPreferences
.
edit
();
// editor.putBoolean(SplashScreen.SESSION, true);
editor
.
putBoolean
(
SplashScreen
.
SESSION
,
true
);
// editor.commit();
if
(
editor
.
commit
()){
// redirect ke home
startActivity
(
new
Intent
(
context
,
MainActivity
.
class
));
startActivity
(
new
Intent
(
context
,
MainActivity
.
class
));
}
// redirect ke home
// set progress bar jadi nonaktif
// set progress bar jadi nonaktif
bar
.
setVisibility
(
View
.
GONE
);
bar
.
setVisibility
(
View
.
GONE
);
...
...
app/src/main/java/com/yono/messeripos/MainActivity.java
View file @
5e2c7278
...
@@ -177,7 +177,7 @@ public class MainActivity extends AppCompatActivity {
...
@@ -177,7 +177,7 @@ public class MainActivity extends AppCompatActivity {
}
else
if
(
id
==
R
.
id
.
create
)
{
}
else
if
(
id
==
R
.
id
.
create
)
{
startActivity
(
new
Intent
(
getApplicationContext
(),
FormProductActivity
.
class
));
startActivity
(
new
Intent
(
getApplicationContext
(),
FormProductActivity
.
class
));
}
else
if
(
id
==
R
.
id
.
allTransaction
){
}
else
if
(
id
==
R
.
id
.
allTransaction
){
startActivity
(
new
Intent
(
getApplicationContext
(),
History
Activity
.
class
));
startActivity
(
new
Intent
(
getApplicationContext
(),
Transaction
Activity
.
class
));
}
}
return
true
;
return
true
;
}
}
...
...
app/src/main/java/com/yono/messeripos/RegisterState.java
View file @
5e2c7278
...
@@ -12,15 +12,24 @@ import android.widget.RelativeLayout;
...
@@ -12,15 +12,24 @@ import android.widget.RelativeLayout;
import
androidx.annotation.NonNull
;
import
androidx.annotation.NonNull
;
import
androidx.annotation.Nullable
;
import
androidx.annotation.Nullable
;
import
androidx.lifecycle.LifecycleOwner
;
import
com.google.android.material.bottomsheet.BottomSheetBehavior
;
import
com.google.android.material.bottomsheet.BottomSheetBehavior
;
import
com.google.android.material.bottomsheet.BottomSheetDialog
;
import
com.google.android.material.bottomsheet.BottomSheetDialog
;
import
com.google.android.material.bottomsheet.BottomSheetDialogFragment
;
import
com.google.android.material.bottomsheet.BottomSheetDialogFragment
;
import
com.google.android.material.button.MaterialButton
;
import
com.google.android.material.button.MaterialButton
;
import
com.google.android.material.textfield.TextInputEditText
;
import
com.google.android.material.textfield.TextInputEditText
;
import
com.yono.messeripos.api.client.Client
;
import
com.yono.messeripos.api.service.UsersService
;
import
com.yono.messeripos.models.MainViewModels
;
import
com.yono.messeripos.models.MainViewModels
;
import
com.yono.messeripos.models.UsersModels
;
import
com.yono.messeripos.response.DataResponse
;
import
com.yono.messeripos.utils.Utils
;
import
com.yono.messeripos.utils.Utils
;
import
retrofit2.Call
;
import
retrofit2.Callback
;
import
retrofit2.Response
;
public
class
RegisterState
extends
BottomSheetDialogFragment
{
public
class
RegisterState
extends
BottomSheetDialogFragment
{
private
static
final
String
TAG
=
"RegisterState"
;
private
static
final
String
TAG
=
"RegisterState"
;
...
@@ -78,9 +87,12 @@ public class RegisterState extends BottomSheetDialogFragment {
...
@@ -78,9 +87,12 @@ public class RegisterState extends BottomSheetDialogFragment {
Log
.
d
(
TAG
,
"onCreateDialog: "
+
sheetBehavior2
.
getState
());
Log
.
d
(
TAG
,
"onCreateDialog: "
+
sheetBehavior2
.
getState
());
// loginButton.setOnClickListener(view1 -> {
registerButton
.
setOnClickListener
(
new
View
.
OnClickListener
()
{
// if (sheetBehavior.getState() != BottomSheetBehavior.STATE_EXPANDED) loginAuth(view1);
@Override
// });
public
void
onClick
(
View
view
)
{
mainViewModels
.
postRegis
(
new
UsersModels
(
username
.
getText
().
toString
(),
email
.
getText
().
toString
(),
password
.
getText
().
toString
(),
repassword
.
getText
().
toString
()));
}
});
// close btn is clicked
// close btn is clicked
closeBtn
.
setOnClickListener
(
view12
->
{
closeBtn
.
setOnClickListener
(
view12
->
{
...
@@ -91,5 +103,21 @@ public class RegisterState extends BottomSheetDialogFragment {
...
@@ -91,5 +103,21 @@ public class RegisterState extends BottomSheetDialogFragment {
return
sheetDialog2
;
return
sheetDialog2
;
}
}
private
void
registerUser
(
View
view
){
// Client client = new Client();
// UsersService usersService = client.Client(UsersService.class);
// usersService.postRegister(new UsersModels(username.getText().toString(),email.getText().toString(),password.getText().toString(),repassword.getText().toString()).enqueue(new Callback<DataResponse<UsersModels>>() {
// @Override
// public void onResponse(Call<DataResponse<UsersModels>> call, Response<DataResponse<UsersModels>> response) {
//
// }
//
// @Override
// public void onFailure(Call<DataResponse<UsersModels>> call, Throwable t) {
//
// }
// });
}
}
}
app/src/main/java/com/yono/messeripos/TransactionActivity.java
0 → 100644
View file @
5e2c7278
package
com
.
yono
.
messeripos
;
import
android.os.Bundle
;
import
android.os.PersistableBundle
;
import
androidx.annotation.Nullable
;
import
androidx.appcompat.app.AppCompatActivity
;
public
class
TransactionActivity
extends
AppCompatActivity
{
@Override
public
void
onCreate
(
Bundle
savedInstanceState
)
{
super
.
onCreate
(
savedInstanceState
);
setContentView
(
R
.
layout
.
activity_list_transaction
);
}
}
app/src/main/java/com/yono/messeripos/adapter/TabAdapterTransaction.java
0 → 100644
View file @
5e2c7278
package
com
.
yono
.
messeripos
.
adapter
;
import
androidx.annotation.NonNull
;
import
androidx.annotation.Nullable
;
import
androidx.fragment.app.Fragment
;
import
androidx.fragment.app.FragmentManager
;
import
androidx.fragment.app.FragmentStatePagerAdapter
;
import
java.util.ArrayList
;
import
java.util.List
;
public
class
TabAdapterTransaction
extends
FragmentStatePagerAdapter
{
private
final
List
<
Fragment
>
mFragmentList
=
new
ArrayList
<>();
private
final
List
<
String
>
mFragmentTitleList
=
new
ArrayList
<>();
public
TabAdapterTransaction
(
@NonNull
FragmentManager
fm
)
{
super
(
fm
);
}
@NonNull
@Override
public
Fragment
getItem
(
int
position
)
{
return
mFragmentList
.
get
(
position
);
}
public
void
addFragment
(
Fragment
fragment
,
String
title
)
{
mFragmentList
.
add
(
fragment
);
mFragmentTitleList
.
add
(
title
);
}
@Nullable
@Override
public
CharSequence
getPageTitle
(
int
position
)
{
return
mFragmentTitleList
.
get
(
position
);
}
@Override
public
int
getCount
()
{
return
mFragmentList
.
size
();
}
}
app/src/main/java/com/yono/messeripos/models/MainViewModels.java
View file @
5e2c7278
...
@@ -151,12 +151,13 @@ public class MainViewModels extends ViewModel {
...
@@ -151,12 +151,13 @@ public class MainViewModels extends ViewModel {
return
usersLogin
;
return
usersLogin
;
}
}
public
MutableLiveData
<
DataResponse
<
UsersModels
>>
checkRegis
(
UsersModels
usersModels
)
{
public
MutableLiveData
<
DataResponse
<
UsersModels
>>
postRegis
(
UsersModels
usersModels
)
{
usersRegister
=
new
MutableLiveData
<>();
usersRegister
=
new
MutableLiveData
<>();
CreateRegister
(
usersModels
);
CreateRegister
(
usersModels
);
return
usersRegister
;
return
usersRegister
;
}
}
private
void
PeriksaLogin
(
UsersModels
usersModels
)
{
private
void
PeriksaLogin
(
UsersModels
usersModels
)
{
UsersService
usersService
=
client
.
Client
(
UsersService
.
class
);
UsersService
usersService
=
client
.
Client
(
UsersService
.
class
);
...
...
app/src/main/java/com/yono/messeripos/models/UsersModels.java
View file @
5e2c7278
...
@@ -12,17 +12,23 @@ public class UsersModels {
...
@@ -12,17 +12,23 @@ public class UsersModels {
@SerializedName
(
"password"
)
@SerializedName
(
"password"
)
private
String
passwordUsers
;
private
String
passwordUsers
;
public
UsersModels
(
String
usernameUsers
,
String
passwordUsers
)
{
@SerializedName
(
"password_confirmation"
)
private
String
passwordConfirmationUsers
;
public
UsersModels
(
String
usernameUsers
,
String
passwordUsers
)
{
this
.
usernameUsers
=
usernameUsers
;
this
.
usernameUsers
=
usernameUsers
;
this
.
passwordUsers
=
passwordUsers
;
this
.
passwordUsers
=
passwordUsers
;
}
}
public
UsersModels
(
String
usernameUsers
,
String
emailUsers
,
String
passwordUsers
)
{
public
UsersModels
(
String
usernameUsers
,
String
emailUsers
,
String
passwordUsers
,
String
passwordConfirmationUsers
)
{
this
.
usernameUsers
=
usernameUsers
;
this
.
usernameUsers
=
usernameUsers
;
this
.
emailUsers
=
emailUsers
;
this
.
emailUsers
=
emailUsers
;
this
.
passwordUsers
=
passwordUsers
;
this
.
passwordUsers
=
passwordUsers
;
this
.
passwordConfirmationUsers
=
passwordConfirmationUsers
;
}
}
public
String
getEmailUsers
()
{
public
String
getEmailUsers
()
{
return
emailUsers
;
return
emailUsers
;
}
}
...
@@ -46,4 +52,12 @@ public class UsersModels {
...
@@ -46,4 +52,12 @@ public class UsersModels {
public
void
setPasswordUsers
(
String
passwordUsers
)
{
public
void
setPasswordUsers
(
String
passwordUsers
)
{
this
.
passwordUsers
=
passwordUsers
;
this
.
passwordUsers
=
passwordUsers
;
}
}
public
String
getPasswordConfirmationUsers
()
{
return
passwordConfirmationUsers
;
}
public
void
setPasswordConfirmationUsers
(
String
passwordConfirmationUsers
)
{
this
.
passwordConfirmationUsers
=
passwordConfirmationUsers
;
}
}
}
app/src/main/java/com/yono/messeripos/nfc/parser/NdefMessageParser.java
0 → 100644
View file @
5e2c7278
package
com
.
yono
.
messeripos
.
nfc
.
parser
;
import
android.nfc.NdefMessage
;
import
android.nfc.NdefRecord
;
import
com.yono.messeripos.nfc.record.ParsedNdefRecord
;
import
com.yono.messeripos.nfc.record.SmartPoster
;
import
com.yono.messeripos.nfc.record.TextRecord
;
import
com.yono.messeripos.nfc.record.UriRecord
;
import
java.util.ArrayList
;
import
java.util.List
;
public
class
NdefMessageParser
{
public
NdefMessageParser
()
{
}
public
static
List
<
ParsedNdefRecord
>
parse
(
NdefMessage
message
)
{
return
getRecords
(
message
.
getRecords
());
}
public
static
List
<
ParsedNdefRecord
>
getRecords
(
NdefRecord
[]
records
)
{
List
<
ParsedNdefRecord
>
elements
=
new
ArrayList
<
ParsedNdefRecord
>();
for
(
final
NdefRecord
record
:
records
)
{
if
(
UriRecord
.
isUri
(
record
))
{
elements
.
add
(
UriRecord
.
parse
(
record
));
}
else
if
(
TextRecord
.
isText
(
record
))
{
elements
.
add
(
TextRecord
.
parse
(
record
));
}
else
if
(
SmartPoster
.
isPoster
(
record
))
{
elements
.
add
(
SmartPoster
.
parse
(
record
));
}
else
{
elements
.
add
(
new
ParsedNdefRecord
()
{
public
String
str
()
{
return
new
String
(
record
.
getPayload
());
}
});
}
}
return
elements
;
}
}
app/src/main/java/com/yono/messeripos/nfc/record/ParsedNdefRecord.java
0 → 100644
View file @
5e2c7278
package
com
.
yono
.
messeripos
.
nfc
.
record
;
public
interface
ParsedNdefRecord
{
String
str
();
}
app/src/main/java/com/yono/messeripos/nfc/record/SmartPoster.java
0 → 100644
View file @
5e2c7278
package
com
.
yono
.
messeripos
.
nfc
.
record
;
import
android.nfc.FormatException
;
import
android.nfc.NdefMessage
;
import
android.nfc.NdefRecord
;
import
com.google.common.base.Charsets
;
import
com.google.common.base.Preconditions
;
import
com.google.common.collect.ImmutableMap
;
import
com.google.common.collect.Iterables
;
import
com.yono.messeripos.nfc.parser.NdefMessageParser
;
import
java.util.Arrays
;
import
java.util.NoSuchElementException
;
public
class
SmartPoster
implements
ParsedNdefRecord
{
/**
* NFC Forum Smart Poster Record Type Definition section 3.2.1.
*
* "The Title record for the service (there can be many of these in
* different languages, but a language MUST NOT be repeated). This record is
* optional."
*/
private
final
TextRecord
mTitleRecord
;
/**
* NFC Forum Smart Poster Record Type Definition section 3.2.1.
*
* "The URI record. This is the core of the Smart Poster, and all other
* records are just metadata about this record. There MUST be one URI record
* and there MUST NOT be more than one."
*/
private
final
UriRecord
mUriRecord
;
/**
* NFC Forum Smart Poster Record Type Definition section 3.2.1.
*
* "The Action record. This record describes how the service should be
* treated. For example, the action may indicate that the device should save
* the URI as a bookmark or open a browser. The Action record is optional.
* If it does not exist, the device may decide what to do with the service.
* If the action record exists, it should be treated as a strong suggestion;
* the UI designer may ignore it, but doing so will induce a different user
* experience from device to device."
*/
private
final
RecommendedAction
mAction
;
/**
* NFC Forum Smart Poster Record Type Definition section 3.2.1.
*
* "The Type record. If the URI references an external entity (e.g., via a
* URL), the Type record may be used to declare the MIME type of the entity.
* This can be used to tell the mobile device what kind of an object it can
* expect before it opens the connection. The Type record is optional."
*/
private
final
String
mType
;
public
SmartPoster
(
UriRecord
uri
,
TextRecord
title
,
RecommendedAction
action
,
String
type
)
{
mUriRecord
=
Preconditions
.
checkNotNull
(
uri
);
mTitleRecord
=
title
;
mAction
=
Preconditions
.
checkNotNull
(
action
);
mType
=
type
;
}
public
UriRecord
getUriRecord
()
{
return
mUriRecord
;
}
/**
* Returns the title of the smart poster. This may be {@code null}.
*/
public
TextRecord
getTitle
()
{
return
mTitleRecord
;
}
public
static
SmartPoster
parse
(
NdefRecord
record
)
{
Preconditions
.
checkArgument
(
record
.
getTnf
()
==
NdefRecord
.
TNF_WELL_KNOWN
);
Preconditions
.
checkArgument
(
Arrays
.
equals
(
record
.
getType
(),
NdefRecord
.
RTD_SMART_POSTER
));
try
{
NdefMessage
subRecords
=
new
NdefMessage
(
record
.
getPayload
());
return
parse
(
subRecords
.
getRecords
());
}
catch
(
FormatException
e
)
{
throw
new
IllegalArgumentException
(
e
);
}
}
public
static
SmartPoster
parse
(
NdefRecord
[]
recordsRaw
)
{
try
{
Iterable
<
ParsedNdefRecord
>
records
=
NdefMessageParser
.
getRecords
(
recordsRaw
);
UriRecord
uri
=
Iterables
.
getOnlyElement
(
Iterables
.
filter
(
records
,
UriRecord
.
class
));
TextRecord
title
=
getFirstIfExists
(
records
,
TextRecord
.
class
);
RecommendedAction
action
=
parseRecommendedAction
(
recordsRaw
);
String
type
=
parseType
(
recordsRaw
);
return
new
SmartPoster
(
uri
,
title
,
action
,
type
);
}
catch
(
NoSuchElementException
e
)
{
throw
new
IllegalArgumentException
(
e
);
}
}
public
static
boolean
isPoster
(
NdefRecord
record
)
{
try
{
parse
(
record
);
return
true
;
}
catch
(
IllegalArgumentException
e
)
{
return
false
;
}
}
@Override
public
String
str
()
{
if
(
mTitleRecord
!=
null
)
{
return
mTitleRecord
.
str
()
+
"\n"
+
mUriRecord
.
str
();
}
else
{
return
mUriRecord
.
str
();
}
}
/**
* Returns the first element of {@code elements} which is an instance of
* {@code type}, or {@code null} if no such element exists.
*/
private
static
<
T
>
T
getFirstIfExists
(
Iterable
<?>
elements
,
Class
<
T
>
type
)
{
Iterable
<
T
>
filtered
=
Iterables
.
filter
(
elements
,
type
);
T
instance
=
null
;
if
(!
Iterables
.
isEmpty
(
filtered
))
{
instance
=
Iterables
.
get
(
filtered
,
0
);
}
return
instance
;
}
public
enum
RecommendedAction
{
UNKNOWN
((
byte
)
-
1
),
DO_ACTION
((
byte
)
0
),
SAVE_FOR_LATER
((
byte
)
1
),
OPEN_FOR_EDITING
(
(
byte
)
2
);
private
static
final
ImmutableMap
<
Byte
,
RecommendedAction
>
LOOKUP
;
static
{
ImmutableMap
.
Builder
<
Byte
,
RecommendedAction
>
builder
=
ImmutableMap
.
builder
();
for
(
RecommendedAction
action
:
RecommendedAction
.
values
())
{
builder
.
put
(
action
.
getByte
(),
action
);
}
LOOKUP
=
builder
.
build
();
}
private
final
byte
mAction
;
private
RecommendedAction
(
byte
val
)
{
this
.
mAction
=
val
;
}
private
byte
getByte
()
{
return
mAction
;
}
}
private
static
NdefRecord
getByType
(
byte
[]
type
,
NdefRecord
[]
records
)
{
for
(
NdefRecord
record
:
records
)
{
if
(
Arrays
.
equals
(
type
,
record
.
getType
()))
{
return
record
;
}
}
return
null
;
}
private
static
final
byte
[]
ACTION_RECORD_TYPE
=
new
byte
[]
{
'a'
,
'c'
,
't'
};
private
static
RecommendedAction
parseRecommendedAction
(
NdefRecord
[]
records
)
{
NdefRecord
record
=
getByType
(
ACTION_RECORD_TYPE
,
records
);
if
(
record
==
null
)
{
return
RecommendedAction
.
UNKNOWN
;
}
byte
action
=
record
.
getPayload
()[
0
];
if
(
RecommendedAction
.
LOOKUP
.
containsKey
(
action
))
{
return
RecommendedAction
.
LOOKUP
.
get
(
action
);
}
return
RecommendedAction
.
UNKNOWN
;
}
private
static
final
byte
[]
TYPE_TYPE
=
new
byte
[]
{
't'
};
private
static
String
parseType
(
NdefRecord
[]
records
)
{
NdefRecord
type
=
getByType
(
TYPE_TYPE
,
records
);
if
(
type
==
null
)
{
return
null
;
}
return
new
String
(
type
.
getPayload
(),
Charsets
.
UTF_8
);
}
}
app/src/main/java/com/yono/messeripos/nfc/record/TextRecord.java
0 → 100644
View file @
5e2c7278
package
com
.
yono
.
messeripos
.
nfc
.
record
;
import
android.nfc.NdefRecord
;
import
com.google.common.base.Preconditions
;
import
java.io.UnsupportedEncodingException
;
import
java.util.Arrays
;
public
class
TextRecord
implements
ParsedNdefRecord
{
private
final
String
mLanguageCode
;
private
final
String
mText
;
public
TextRecord
(
String
languageCode
,
String
text
)
{
mLanguageCode
=
Preconditions
.
checkNotNull
(
languageCode
);
mText
=
Preconditions
.
checkNotNull
(
text
);
}
@Override
public
String
str
()
{
return
mText
;
}
public
String
getText
()
{
return
mText
;
}
/**
* Returns the ISO/IANA language code associated with this text element.
*/
public
String
getLanguageCode
()
{
return
mLanguageCode
;
}
// TODO: deal with text fields which span multiple NdefRecords
public
static
TextRecord
parse
(
NdefRecord
record
)
{
Preconditions
.
checkArgument
(
record
.
getTnf
()
==
NdefRecord
.
TNF_WELL_KNOWN
);
Preconditions
.
checkArgument
(
Arrays
.
equals
(
record
.
getType
(),
NdefRecord
.
RTD_TEXT
));
try
{
byte
[]
payload
=
record
.
getPayload
();
/*
* payload[0] contains the "Status Byte Encodings" field, per the
* NFC Forum "Text Record Type Definition" section 3.2.1.
*
* bit7 is the Text Encoding Field.
*
* if (Bit_7 == 0): The text is encoded in UTF-8 if (Bit_7 == 1):
* The text is encoded in UTF16
*
* Bit_6 is reserved for future use and must be set to zero.
*
* Bits 5 to 0 are the length of the IANA language code.
*/
String
textEncoding
=
((
payload
[
0
]
&
0200
)
==
0
)
?
"UTF-8"
:
"UTF-16"
;
int
languageCodeLength
=
payload
[
0
]
&
0077
;
String
languageCode
=
new
String
(
payload
,
1
,
languageCodeLength
,
"US-ASCII"
);
String
text
=
new
String
(
payload
,
languageCodeLength
+
1
,
payload
.
length
-
languageCodeLength
-
1
,
textEncoding
);
return
new
TextRecord
(
languageCode
,
text
);
}
catch
(
UnsupportedEncodingException
e
)
{
// should never happen unless we get a malformed tag.
throw
new
IllegalArgumentException
(
e
);
}
}
public
static
boolean
isText
(
NdefRecord
record
)
{
try
{
parse
(
record
);
return
true
;
}
catch
(
IllegalArgumentException
e
)
{
return
false
;
}
}
}
app/src/main/java/com/yono/messeripos/nfc/record/UriRecord.java
0 → 100644
View file @
5e2c7278
package
com
.
yono
.
messeripos
.
nfc
.
record
;
import
android.annotation.SuppressLint
;
import
android.net.Uri
;
import
android.nfc.NdefRecord
;
import
androidx.core.util.Preconditions
;
import
com.google.common.collect.BiMap
;
import
com.google.common.collect.ImmutableBiMap
;
import
com.google.common.primitives.Bytes
;
import
java.nio.charset.Charset
;
import
java.util.Arrays
;
public
class
UriRecord
implements
ParsedNdefRecord
{
private
static
final
String
TAG
=
"UriRecord"
;
public
static
final
String
RECORD_TYPE
=
"UriRecord"
;
private
static
final
BiMap
<
Byte
,
String
>
URI_PREFIX_MAP
=
ImmutableBiMap
.<
Byte
,
String
>
builder
()
.
put
((
byte
)
0x00
,
""
)
.
put
((
byte
)
0x01
,
"http://www."
)
.
put
((
byte
)
0x02
,
"https://www."
)
.
put
((
byte
)
0x03
,
"http://"
)
.
put
((
byte
)
0x04
,
"https://"
)
.
put
((
byte
)
0x05
,
"tel:"
)
.
put
((
byte
)
0x06
,
"mailto:"
)
.
put
((
byte
)
0x07
,
"ftp://anonymous:anonymous@"
)
.
put
((
byte
)
0x08
,
"ftp://ftp."
)
.
put
((
byte
)
0x09
,
"ftps://"
)
.
put
((
byte
)
0x0A
,
"sftp://"
)
.
put
((
byte
)
0x0B
,
"smb://"
)
.
put
((
byte
)
0x0C
,
"nfs://"
)
.
put
((
byte
)
0x0D
,
"ftp://"
)
.
put
((
byte
)
0x0E
,
"dav://"
)
.
put
((
byte
)
0x0F
,
"news:"
)
.
put
((
byte
)
0x10
,
"telnet://"
)
.
put
((
byte
)
0x11
,
"imap:"
)
.
put
((
byte
)
0x12
,
"rtsp://"
)
.
put
((
byte
)
0x13
,
"urn:"
)
.
put
((
byte
)
0x14
,
"pop:"
)
.
put
((
byte
)
0x15
,
"sip:"
)
.
put
((
byte
)
0x16
,
"sips:"
)
.
put
((
byte
)
0x17
,
"tftp:"
)
.
put
((
byte
)
0x18
,
"btspp://"
)
.
put
((
byte
)
0x19
,
"btl2cap://"
)
.
put
((
byte
)
0x1A
,
"btgoep://"
)
.
put
((
byte
)
0x1B
,
"tcpobex://"
)
.
put
((
byte
)
0x1C
,
"irdaobex://"
)
.
put
((
byte
)
0x1D
,
"file://"
)
.
put
((
byte
)
0x1E
,
"urn:epc:id:"
)
.
put
((
byte
)
0x1F
,
"urn:epc:tag:"
)
.
put
((
byte
)
0x20
,
"urn:epc:pat:"
)
.
put
((
byte
)
0x21
,
"urn:epc:raw:"
)
.
put
((
byte
)
0x22
,
"urn:epc:"
)
.
put
((
byte
)
0x23
,
"urn:nfc:"
)
.
build
();
private
final
Uri
mUri
;
@SuppressLint
(
"RestrictedApi"
)
public
UriRecord
(
Uri
uri
)
{
this
.
mUri
=
Preconditions
.
checkNotNull
(
uri
);
}
@Override
public
String
str
()
{
return
mUri
.
toString
();
}
public
static
UriRecord
parse
(
NdefRecord
record
)
{
short
tnf
=
record
.
getTnf
();
if
(
tnf
==
NdefRecord
.
TNF_WELL_KNOWN
)
{
return
parseWellKnown
(
record
);
}
else
if
(
tnf
==
NdefRecord
.
TNF_ABSOLUTE_URI
)
{
return
parseAbsolute
(
record
);
}
throw
new
IllegalArgumentException
(
"Unknown TNF "
+
tnf
);
}
/** Parse and absolute URI record */
private
static
UriRecord
parseAbsolute
(
NdefRecord
record
)
{
byte
[]
payload
=
record
.
getPayload
();
Uri
uri
=
Uri
.
parse
(
new
String
(
payload
,
Charset
.
forName
(
"UTF-8"
)));
return
new
UriRecord
(
uri
);
}
/** Parse an well known URI record */
@SuppressLint
(
"RestrictedApi"
)
private
static
UriRecord
parseWellKnown
(
NdefRecord
record
)
{
Preconditions
.
checkArgument
(
Arrays
.
equals
(
record
.
getType
(),
NdefRecord
.
RTD_URI
));
byte
[]
payload
=
record
.
getPayload
();
/*
* payload[0] contains the URI Identifier Code, per the
* NFC Forum "URI Record Type Definition" section 3.2.2.
*
* payload[1]...payload[payload.length - 1] contains the rest of
* the URI.
*/
String
prefix
=
URI_PREFIX_MAP
.
get
(
payload
[
0
]);
byte
[]
fullUri
=
Bytes
.
concat
(
prefix
.
getBytes
(
Charset
.
forName
(
"UTF-8"
)),
Arrays
.
copyOfRange
(
payload
,
1
,
payload
.
length
));
Uri
uri
=
Uri
.
parse
(
new
String
(
fullUri
,
Charset
.
forName
(
"UTF-8"
)));
return
new
UriRecord
(
uri
);
}
public
static
boolean
isUri
(
NdefRecord
record
)
{
try
{
parse
(
record
);
return
true
;
}
catch
(
IllegalArgumentException
e
)
{
return
false
;
}
}
private
static
final
byte
[]
EMPTY
=
new
byte
[
0
];
}
app/src/main/java/com/yono/messeripos/transactiontab/TransactionSuccess.java
0 → 100644
View file @
5e2c7278
package
com
.
yono
.
messeripos
.
transactiontab
;
import
android.os.Bundle
;
import
android.view.LayoutInflater
;
import
android.view.View
;
import
android.view.ViewGroup
;
import
androidx.annotation.NonNull
;
import
androidx.annotation.Nullable
;
import
androidx.fragment.app.Fragment
;
import
com.yono.messeripos.R
;
public
class
TransactionSuccess
extends
Fragment
{
@Nullable
@Override
public
View
onCreateView
(
@NonNull
LayoutInflater
inflater
,
@Nullable
ViewGroup
container
,
@Nullable
Bundle
savedInstanceState
)
{
return
inflater
.
inflate
(
R
.
layout
.
activity_history
,
container
,
false
);
}
}
app/src/main/res/layout/activity_list_transaction.xml
0 → 100644
View file @
5e2c7278
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
>
<include
android:id=
"@+id/toolbar"
layout=
"@layout/app_bar"
/>
<com.google.android.material.tabs.TabLayout
android:id=
"@+id/tabLayout"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:minHeight=
"?actionBarSize"
app:tabGravity=
"fill"
app:tabIndicatorColor=
"@color/colorGreen"
app:tabIndicatorHeight=
"4dp"
app:tabBackground=
"@drawable/gradient"
app:layout_constraintTop_toBottomOf=
"@id/toolbar"
app:tabMode=
"fixed"
/>
<androidx.viewpager.widget.ViewPager
android:id=
"@+id/viewPager"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
app:layout_constraintTop_toBottomOf=
"@id/tabLayout"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
app/src/main/res/menu/home.xml
View file @
5e2c7278
...
@@ -26,4 +26,10 @@
...
@@ -26,4 +26,10 @@
android:title=
"All Transaction"
android:title=
"All Transaction"
app:showAsAction=
"never"
/>
app:showAsAction=
"never"
/>
<item
android:id=
"@+id/logout"
android:orderInCategory=
"100"
android:title=
"Logout"
app:showAsAction=
"never"
/>
</menu>
</menu>
\ No newline at end of file
app/src/main/res/values-w820dp/dimens.xml
0 → 100644
View file @
5e2c7278
<resources>
<!-- Example customization of dimensions originally defined in res/values/dimens.xml
(such as screen margins) for screens with more than 820dp of available width. This
would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
<dimen
name=
"activity_horizontal_margin"
>
64dp
</dimen>
</resources>
\ No newline at end of file
app/src/main/res/values/dimens.xml
0 → 100644
View file @
5e2c7278
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen
name=
"activity_horizontal_margin"
>
16dp
</dimen>
<dimen
name=
"activity_vertical_margin"
>
16dp
</dimen>
<dimen
name=
"appbar_padding"
>
16dp
</dimen>
<dimen
name=
"fab_margin"
>
16dp
</dimen>
<dimen
name=
"appbar_padding_top"
>
8dp
</dimen>
</resources>
\ No newline at end of file
app/src/main/res/values/strings.xml
View file @
5e2c7278
...
@@ -41,6 +41,9 @@
...
@@ -41,6 +41,9 @@
<item>
Uranus
</item>
<item>
Uranus
</item>
<item>
Neptune
</item>
<item>
Neptune
</item>
</string-array>
</string-array>
<string
name=
"title_activity_list_transactions"
>
ListTransactions
</string>
<string
name=
"tab_text_1"
>
Tab 1
</string>
<string
name=
"tab_text_2"
>
Tab 2
</string>
</resources>
</resources>
\ No newline at end of file
app/src/main/res/values/styles.xml
View file @
5e2c7278
...
@@ -36,7 +36,7 @@
...
@@ -36,7 +36,7 @@
<style
name=
"ThemeActionBar"
parent=
"Widget.MaterialComponents.Light.ActionBar.Solid"
>
<style
name=
"ThemeActionBar"
parent=
"Widget.MaterialComponents.Light.ActionBar.Solid"
>
<item
name=
"android:background"
>
@null
</item>
<item
name=
"android:background"
>
@null
</item>
<!-- Support library compatibility -->
<!-- Support library compatibility -->
<item
name=
"background"
>
@null
</item>
<item
name=
"background"
>
@null
</item>
<item
name=
"android:displayOptions"
>
showHome|useLogo
</item>
<item
name=
"android:displayOptions"
>
showHome|useLogo
</item>
...
@@ -44,7 +44,8 @@
...
@@ -44,7 +44,8 @@
</style>
</style>
<style
name=
"AppTheme.PopupOverlay"
parent=
"ThemeOverlay.AppCompat.Light"
/>
<style
name=
"AppTheme.PopupOverlay"
parent=
"ThemeOverlay.AppCompat.Light"
/>
<style
name=
"AppTheme.AppBarOverlay"
parent=
"ThemeOverlay.AppCompat.Dark.ActionBar"
/>
<style
name=
"AppTheme.AppBarOverlay"
parent=
"ThemeOverlay.AppCompat.Dark.ActionBar"
/>
<style
name=
"Widget.TextInputLayout"
parent=
"Widget.MaterialComponents.TextInputLayout.OutlinedBox"
>
<style
name=
"Widget.TextInputLayout"
parent=
"Widget.MaterialComponents.TextInputLayout.OutlinedBox"
>
<item
name=
"hintTextAppearance"
>
@style/TextAppearance.TextInputLayout.HintText
</item>
<item
name=
"hintTextAppearance"
>
@style/TextAppearance.TextInputLayout.HintText
</item>
...
@@ -81,9 +82,7 @@
...
@@ -81,9 +82,7 @@
<item
name=
"cornerFamily"
>
rounded
</item>
<item
name=
"cornerFamily"
>
rounded
</item>
</style>
</style>
<style
<style
name=
"ThemeOverlay.Rounded.BottomSheetDialog"
parent=
"@style/ThemeOverlay.MaterialComponents.BottomSheetDialog"
>
name=
"ThemeOverlay.Rounded.BottomSheetDialog"
parent=
"@style/ThemeOverlay.MaterialComponents.BottomSheetDialog"
>
<item
name=
"bottomSheetStyle"
>
@style/Widget.Rounded.BottomSheet
</item>
<item
name=
"bottomSheetStyle"
>
@style/Widget.Rounded.BottomSheet
</item>
</style>
</style>
...
@@ -94,4 +93,9 @@
...
@@ -94,4 +93,9 @@
<style
name=
"AppModalStyle"
parent=
"Widget.Design.BottomSheet.Modal"
>
<style
name=
"AppModalStyle"
parent=
"Widget.Design.BottomSheet.Modal"
>
<item
name=
"android:background"
>
@drawable/round_corner_sheet
</item>
<item
name=
"android:background"
>
@drawable/round_corner_sheet
</item>
</style>
</style>
<style
name=
"AppTheme.NoActionBar"
>
<item
name=
"windowActionBar"
>
false
</item>
<item
name=
"windowNoTitle"
>
true
</item>
</style>
</resources>
</resources>
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment